= 2011-04-11 = == VMWare Server == * 雖然知道 trac 網站效能低落的主因是主機實體記憶體不足(只有 2GB),但始終找不到好的方法可以最佳化。 * [[Image(jazz/11-04-11:11-04-11_cpu-week.png)]] * 今天大概找到幾個方法: * <1> 將 VMDK 檔案變成多個 2GB 的檔案,這樣有助於減少系統花在 File System Cache 的記憶體。 * 首先,參考 [http://www.howtoforge.com/how-to-shrink-vmware-virtual-disk-files-vmdk How To Shrink VMware Virtual Disk Files (.vmdk)],先塞 /dev/zero 到剩餘空間去。 * 因為切成三個磁區,所以要對 / 以及 /home 兩個掛載點做動作 {{{ jazz@trac-pool:~$ sudo blkid /dev/sda1: UUID="d659e093-f3b5-4a5d-be27-fd6ab81f1ace" TYPE="reiserfs" /dev/sda5: UUID="3bad1077-171b-448b-9dc0-a8a0d84ee549" TYPE="swap" /dev/sda6: UUID="bc027096-44bf-437a-a461-b5cd116942c4" TYPE="reiserfs" jazz@trac-pool:~$ mount /dev/sda1 on / type reiserfs (rw,notail) /dev/sda6 on /home type reiserfs (rw) }}} * 首先,根據 pidstat -d 5 把比較多 I/O 的 process 關閉 {{{ jazz@trac-pool:~$ sudo /etc/init.d/apache2 stop jazz@trac-pool:~$ sudo /etc/init.d/varnish stop jazz@trac-pool:~$ sudo /etc/init.d/munin-node stop }}} * 接著,把 /home 塞滿 /dev/zero 再清掉: {{{ jazz@trac-pool:~$ cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill }}} * 其次,清除不必要的快取,再把 / 塞滿 /dev/zero 再清掉: {{{ jazz@trac-pool:~$ sudo apt-get clean jazz@trac-pool:~$ sudo su - root@trac-pool:~# cd / root@trac-pool:/# cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill }}} * 關閉虛擬機器。然後進到 VM 主機,把原本高達 26GB 的單檔 VMDK 進行 Shrink 的動作 {{{ jazz@vm:~$ cd /var/lib/vmware/Virtual\ Machines/Trac_Pool jazz@vm:/var/lib/vmware/Virtual Machines/Trac_Pool$ sudo vmware-vdiskmanager -r Trac_Pool.vmdk -t 1 Trac_Pool_New.vmdk }}} * 縮完之後果然有差,VMDK 檔案空間總和變小了,大概是 18.6GB 左右。 {{{ $ du Trac_Pool_New*.vmdk | awk '{ SUM=SUM+$1 } END { print SUM }' 18623760 }}} * <2> 調整 Aggressiveness of swapping * 參考 [http://distilledb.com/blog/archives/date/2009/02/22/swap-files-in-linux.page Understanding swap files in Linux] * 首先,將 SWAP 的內容釋放出來 {{{ ~$ sudo swapoff -a ~$ sudo swapon -a }}} * 其次,把 /proc/sys/vm/swappiness 設為 0 (盡可能不做 SWAP) {{{ ~$ sudo sysctl -w vm.swappiness=0 }}} * 最後,設定 /proc/sys/vm/vfs_cache_pressure 設高,使 kernel 更勤於回收 cache。 {{{ ~$ sudo sysctl -w vm.vfs_cache_pressure=200 }}} * <3> 最後,應該說是這一連串記憶體不足事件的元兇:VMWare Server 2.0.0-122956 的 WebAccess 介面!! * 根據 top 的結果,若按下大寫「O」,選「o:VIRT」排序,會發現大致上排行榜前三名是 vmware-vmx 跟 webAccess * 本來實體記憶體就不夠了,居然浪費在很少用的網頁介面上,實在是不智之舉。所以要把它關掉。 * 改法是參考 [http://blog.netnerds.net/2009/01/vmware-server-2-for-linux-how-to-disable-vmware-virtual-infrastructure-web-access/ VMware Server 2 for Linux: HOW-TO Disable VMware Virtual Infrastructure Web Access] 這篇文章,為了不關閉 vmware-hostd 而關閉 webAccess 要往返註解兩處。 * 第一次先改 /etc/init.d/vmware 的第 1202 行 {{{ #!diff --- /etc/init.d/vmware.org 2011-04-11 23:31:35.000000000 +0800 +++ /etc/init.d/vmware 2011-04-11 23:32:12.000000000 +0800 @@ -1199,7 +1199,7 @@ vmware_stop_webAccess #clean up output from webAccess echo - vmware_stop_hostd + #vmware_stop_hostd fi ;; restart) }}} * 然後下 vmware-mgmt stop {{{ ~$ sudo /etc/init.d/vmware-mgmt stop }}} * 接著把上一個修正改回來,然後註解掉啟動 webAccess 的第 1191 行 {{{ #!diff --- vmware.1 2011-04-11 23:32:12.000000000 +0800 +++ vmware.2 2011-04-11 23:30:52.000000000 +0800 @@ -1188,7 +1188,7 @@ if [ "`vmware_product`" = "wgs" ]; then echo 'Starting VMware management services:' vmware_start_hostd - vmware_start_webAccess + #vmware_start_webAccess #clean up output from webAccess echo fi @@ -1199,7 +1199,7 @@ vmware_stop_webAccess #clean up output from webAccess echo - #vmware_stop_hostd + vmware_stop_hostd fi ;; restart) }}} * 最後下 vmware-mgmt start 把服務啟動。 {{{ ~$ sudo /etc/init.d/vmware-mgmt start }}} * 這樣,排行榜前三大,就剩下 vmware-vmx 跟 vmware-hostd {{{ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 23442 root 20 0 1033m 892m 879m S 5 44.8 15:43.05 vmware-vmx 3440 root 20 0 401m 181m 169m S 3 9.1 268:32.23 vmware-vmx 2841 root 20 0 142m 56m 15m S 0 2.8 8:54.46 vmware-hostd }}}