like many people, i like to tinker with all sorts of different technology including multiple operating systems as well as the different roles they can play. one of the best ways that i can do that is by using a virtualization product. i just happen to use vmware server 2.0 on my debian lenny server. vmware is one of the leaders in virtualization (if not the leader).
at home, i have five virtual machines that i rely on heavily for my day-to-day operations. i have two windows server 2008 domain controllers, two windows server 2003 servers running exchange 2003 and one windows server 2008 computer i use for remote desktop and management of services. some of these services can provide a fair load on my server and i was starting to see the impact, especially from my win2k8 vms. it seems that there are a number of optimizations that are not enabled by default in vmware server. i searched far and wide through vmware kb docs as well as blogs and web forums and came up with the following optimizations:
force virtual machines to run in shared memory (in ram)
inside /etc/vmware/config
lies the default config for vmware. add the following lines at the end:
MemTrimRate = "0"
mainMem.useNamedFile = "FALSE"
sched.mem.pshare.enable = "FALSE"
tmpDirectory="/dev/shm"
this will ensure that virtual machines actually store their virtual memory on /dev/shm. /dev/shm is a location that most linux distributions use for shared memory that is located directly on ram (think of a ramdisk). you will want to make sure that your host makes uses of /dev/shm as seen below:
root@athena:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md0 67G 7.3G 56G 12% /
tmpfs 4.0G 0 4.0G 0% /lib/init/rw
udev 10M 972K 9.1M 10% /dev
tmpfs 8.0G 5.1G 3.0G 64% /dev/shm
/dev/md2 917G 665G 207G 77% /media/md2
/dev/md3 917G 556G 315G 64% /media/md3
the text in italics above is what you are looking for. by default, most distros will not allocate that much space for shared memory. however, you can specify the size in the file /etc/default/tmpfs
:
# SHM_SIZE sets the maximum size (in bytes) that the /dev/shm tmpfs can use.
# If this is not set then the size defaults to the value of TMPFS_SIZE
# if that is set; otherwise to the kernel's default.
#
# The size will be rounded down to a multiple of the page size, 4096 bytes.
SHM_SIZE=8G
by default the variable seen above will be blank (ie - SHM_SIZE=
). i set mine to 8GB because i have 8GB of ram in my server. the great thing about using shared memory is that if you happen to actually fill up your system’s ram, it will start using swap space instead of just running out of room.
next, i added a few lines to the file /etc/sysctl.conf
:
vm.swappiness = 0
vm.overcommit_memory = 1
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 1000
it is my understanding that these are meant to help prevent vmware from using the swap file unnecessarily.
last but not least, i needed to do a little bit of optimization of my file system. my server uses software raid 1 with an ext3 file system so write performance isn’t amazing but to speed things up, i changed a few of the mount options in my /etc/fstab
:
/etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
/dev/md0 / ext3 errors=remount-ro,relatime 0 1
/dev/md1 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0
/dev/md2 /media/md2 ext3 defaults,noatime,nodiratime 0 2
/dev/md3 /media/md3 ext3 defaults,noatime,nodiratime 0 2
i added the noatime,nodiratime
options so that write times are not constantly being recorded causing excessive delays.
these settings seem to make my virtual machines run smoother and boot much faster.