The following describes how to performance tune Ubuntu Server virtual machines for use in Azure. Although this article focuses on Ubuntu Server because it’s better established in Azure at this time. It’s worth mentioning that Debian offers better performance and stability overall, albeit at the cost of some of the more recent functionality support available in Ubuntu. Regardless many of the optimizations discussed below apply equally to both although commands and settings may vary occasionally.

Best practice recommendations from Microsoft.

  1. Don’t use the OS disk for other workloads.
  2. Use a 1TB disk minimum for all data workloads.
  3. Use storage accounts in the same datacenter as your virtual machines.
  4. In need of additional IOPs? Add more, not bigger disks.
  5. Limit the number of disks in a storage account to no more than 40.
  6. Use Premium storage for blobs backed by SSDs where necessary.
  7. Disable ‘barriers’ for all premium disks using ‘Readonly’ or ‘None’ caching.
  8. Storage accounts have a limit of 20K IOPs and 500TB capacity.
  9. Enable ‘Read’ caching for small read datasets only, disable it if not.
  10. Don’t store your Linux swapfile on the temporary drive provided by default.
  11. Use EXT4 filesystem.
  12. In Azure IOPs are throttled according to VM size so choose accordingly.

Linux specific optimisations you might also consider.

1. Decrease memory ‘swappiness’ and increase inode caching:

[code language=”bash”]sudo echo vm.swappiness=10 >> /etc/sysctl.conf
sudo echo vm.vfs_cache_pressure=50 >> /etc/sysctl.conf[/code]

For more information:

2. Disable CPU scaling / run at maximum frequency all the time:

[code language=”bash”]sudo chmod -x /etc/init.d/ondemand[/code]

For more information:

3. Mount all disks with ‘noatime’ and ‘nobarrier’ (see above) options:

[code language=”bash”]sudo vim /etc/fstab[/code]

Add ‘noatime,nobarrier’ to the mount options of all disks.

For more information:

4. Upgrade to a more recent Ubuntu kernel image and remove the old:

[code language=”bash”]sudo aptitude update
sudo aptitude search linux-image
sudo aptitude install -y linux-image-4.4.0-28-generic
sudo aptitude remove -y linux-image-3.19.0-65-generic[/code]

In the example above the latest available kernel version available is version ‘linux-image-4.4.0-28-generic’ and the version currently installed was ‘linux-image-3.19.0-65-generic’ but these will change of course.

5. Change IO scheduler to something more suited to SSDs (i.e. deadline):

Edit the grub defaults file.

[code language=”bash”]sudo vim /etc/default/grub[/code]

Change the following line from



GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash elevator=deadline

Then run

[code language=”bash”]sudo update-grub2[/code]

For more information:

6. Mount a suitably sized data disk:

First start by creating a new 1TB disk using the Azure CLI.

Partition the new disk and format it in ext4 using the following script.

[code language=”bash”]#!/bin/sh</div>
for i in $hdd;do
echo "n
"|fdisk $i;mkfs.ext4 $i;done[/code]

Mount the disk.

[code language=”bash”]mkdir /mnt/data/
mount -t ext4 /dev/sdc1 /mnt/data/[/code]

Obtain UUID of newly mounted disk.

[code language=”bash”]blkid /dev/sdc[/code]

Add the following to /etc/fstab.

UUID=<NEW DISK UUID>       /        ext4   noatime,defaults,discard        0 0

6. Add a swap file:

[code language=”bash”]sudo dd if=/dev/zero of=/mnt/data/swapfile bs=1G count=32
sudo chmod 600 /mnt/data/swapfile
sudo mkswap /mnt/data/swapfile
sudo swapon /mnt/data/swapfile
echo "/mnt/data/swapfile   none    swap    sw    0   0" >> /etc/fstab[/code]

8. Enable Linux Kernel TRIM support for SSD drives:

[code language=”bash”]sudo sed -i ‘s/exec fstrim-all/exec fstrim-all –no-model-check/g’ /etc/cron.weekly/fstrim[/code]

For more information:


Azure Platform, Cloud Infrastructure, Uncategorized
, , , , ,

Join the conversation! 3 Comments

  1. Any chance you are putting this all in a script that can be used as an extension script to be ran after deployment?

  2. A colleague is working on this. I will include it here when it’s ready.

Comments are closed.