昨天晚上在虚拟机上编译一个程序,命令启动后就睡觉了,今天早上起床,我的个乖乖,居然还在运行。用top看了一下cpu使用5%左右,空闲内存70M左右,脑袋一怕,估计IO有问题。因为我的vmware虚拟机是安装在移动硬盘上的,而编译过程需要读写/tmp目录,于是就想给虚拟机加独立的硬盘:
- 先关闭虚拟机,然后修改设置,增加硬盘
- 使用fdisk -l 察看新硬盘,我的显示
/dev/sdb1
- 使用fdisk /dev/sdb1进行分区,我就分了一个
- backup /tmp to /tmp2
- mount /dev/sdb1 /tmp
- chmod 777 /tmp
结果发现还是不行,于是用vmstat 命令进行性能分析,发现swaped有1.9G, wa 一直在 95%以上。这时知道是内存不够。
下面是系统正常情况下vmstat 3 命令的输出。
r: 进程队列数
b:等待IO进程数
swpd:使用的虚拟内存
wa:等待IOcpu时间
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 185300 72 201920 0 0 0 0 59 125 0 0 100 0 0
0 0 0 185300 72 201920 0 0 0 0 60 130 0 0 100 0 0
0 0 0 185300 72 201920 0 0 0 0 55 120 0 0 100 0 0
0 0 0 185300 72 201920 0 0 0 4 58 125 0 0 100 0 0
0 0 0 185300 72 201920 0 0 0 6 61 131 0 0 100 0 0
0 0 0 185300 72 201920 0 0 0 0 55 120 0 0 100 0 0
既然swap导致IO问题,能不能将swap分区换到IO性能更高的磁盘上呢?
下面是具体步骤:
1 mkswap /dev/sdb1
2 swapon /dev/sdb1
3. 使用swapon命令查看之前的swap分区并用swapoff命令关闭
4. 在/etc/fstab文件中加入:/dev/sdb1 swap swap defaults 0 0
这样重起也会自动生效
结果发现没有任何改进,没办法只能先增加虚拟机的内存,以后再看看为什么程序消耗太多内存。