kvm内存优化:
调高内存回收水位值
echo 10 > /proc/sys/vm/swappiness
echo 1024000 > /proc/sys/vm/min_free_kbytes
在文件/etc/sysctl.conf中加入 vm.dirty_ratio=10
原理:linux会设置40%的可用内存用来做系统cache,当flush数据时这40%内存中的数据由于和IO同步问题可能导致超时(120s),所将40%减小到10%,避免超时
echo 'vm.dirty_ratio=10' >> /etc/sysctl.conf && sysctl -p
/#swap使用阀值:
echo 'vm.swappiness=1' >> /etc/sysctl.conf &&sysctl -p
/#手动释放swap
sync && echo 1 > /proc/sys/vm/drop_caches
nohup swapoff -a && swapon -a &
http://www.sohu.com/a/137793375_610730
1、开启内存扩展技术EPT
有了EPT技术,那么能够将虚拟机的物理地址直接翻译为宿主机的物理地址,从而把后面那个转换过程去掉了,增加了效率。
只要在BIOS打开了intel 的VT设置
2、
虚拟机可以通过分配巨型页也就是刚才说的大页来提高运行性能。
我们可以先通过命令 cat /proc/meminfo | grep HugePages查看当前系统有多少个大页:
我们看到,当前数量是0。
那么如何设置大页的数量呢?也就是上面的HugePages_Total的数量。
只要运行echo 2000 > /proc/sys/vm/nr_hugepages这个命令即可:
当然这样重启会失效,我们运行这个命令让它永久生效 :sysctl -w vm.nr_hugepages=2000
centos7 如何设置?
接下来,我们还得把大页进行挂载,我们运行:
mount -t hugetlbfs hugetlbfs /dev/hugepages
这个hugetlbfs 是一种特殊文件系统,那至于为什么采用这样的文件系统是因为这样花费的代价小。
那么通过这几步操作,开启->设置大页数量->挂载, 那么宿主机这块就没什么问题了。
3、KSM(Kernel SamePage Merging),也就是所谓的相同页面内存压缩技术。
KSM的原理,是多个进程中,Linux将内核相似的内存页合并成一个内存页。这个特性,被KVM用来减少多个相似的虚拟机的内存占用,提高内存的使用效率。由于内存是共享的,所以多个虚拟机使用的内存减少了。这个特性,对于虚拟机使用相同镜像和操作系统时,效果更加明显。
但是,事情总是有代价的,使用这个特性,都要增加内核开销,用时间换空间。所以为了提高效率,可以将这个特性关闭。方法是:
4、KVM Huge Page Backed Memory
使用方法,需要三部:
mount -t hugetlbfs hugetlbfs /dev/hugepages
保留一些内存给巨页
sysctl vm.nr_hugepages=516
给 kvm 传递参数 hugepages
qemu-kvm - qemu-kvm -mem-path /dev/hugepages
cpu优化:
cpu结构参考文档:
http://kodango.com/cpu-topology
绑定cpu,共享了L3 cache,运行效率自然比随机选择cpu运行,运行中还有可能切换cpu,内存访问有可能跨node的第一种方式要快了
kvm针对cpu和内存是全虚拟机和,针对io和网络则是半虚拟化virtio。
writeback mode在mailserver这种小文件高io的服务器上,其性能是很差的,none模式大部分情况要比writethrough性能稍好一点,所以选择none。
启用方式在libvirt xml disk中加入
磁盘io:
aio
异步读写,分别包括Native aio: kernel AIO 和 threaded aio: user space AIO emulated by posix thread workers,内核方式要比用户态的方式性能稍好一点,所以一般情况都选择native,开启方式
块设备调度器
cfq:perprocess IO queue,较好公平性,较低aggregate throughput
deadline:per-device IO queue,较好实时性,较好aggregate throughput,不够公平,当某些vm有大量io操作,占用了大量io资源时,其它后加入的vm很有可能抢占不到io资源。
echo cfq > /sys/block/sda/queue/scheduler 改成cfq模式
Linux文件系统性能优化参考:
http://blog.chinaunix.net/uid-7530389-id-2050116.html
KVM 缓存模式概览 通常,虚拟机使用宿主机上的一个文件保存它的数据,这个文件代表一个虚拟机作为正常的物理磁盘使用的虚 拟磁盘,然而,从宿主机的角度来看这个虚拟磁盘只是一个正常的数据文件并且可以对它缓存
在这种情况下,缓存是隐藏一些磁盘数据在内存中.当我们只在内存中存储上次读的数据,我们称之为读缓存,或 者 write-through 缓存.当我们还存储一些要写到硬盘的数据在内存中,在以后的某个时间再写到磁盘,我们称 之为读写缓存,或者 write-back 缓存,write-back 缓存通过将写磁盘请求缓存到高速内存中,有更高的性能,然 而它也比 write-through 更有可能丢失数据,因为后者只缓存读请求,写请求立即写到磁盘里。
如果缓存策略是'writeback',数据会缓存到宿主机的页缓存中
如果缓存策略是'none',数据立即写到物理磁盘
如果缓存策略是'writethrough',数据将立即写到物理磁盘
qcow2镜像优势:
1、更小的空间占用
2、支持写时拷贝 copy on write
3、 支持快照
4、支持zilib压缩
5、支持加密
preallocation :
预分配就是说预先将镜像所需的文件空间提供给镜像,这样文件的真实大小不再是“假”的了,对于磁盘来说这个文件真的用了这么多地址 使用df -h 或者du 也会看到真的占用了这么多空间 还可以减少文件的碎片产生,因为地址空间是连续的 raw和qcow2都支持preallocation选项,就是空间预分配。
创建预分配元数据的qcow2格式的镜像应该是参照了 原始的raw镜像文件的一些特点 做的一部分加快读写的优化 ,原理同raw一样,提前以空数据的方式将空间占用,而不是像普通的qcow2格式,按需递增占用 。而以上无论是raw格式还是qcow2预分配元数据的方式都不会直接将1G的空间完全占用,对宿主机的i节点占用上也没有影响,这个可以通过各文件创建和删除后df -hl和df -i 的结果来测试 。
qemu-img create -f qcow2 -o preallocation=metadata
ext4 性能要比 xfs 高,这可能是默认的挂载参数不能充分发挥 xfs 的性能
进程等待IO时,经常处于D状态,即TASK_UNINTERRUPTIBLE状态,处于这种状态的进程不处理信号,所以kill不掉,如果进程长期处于D状态,那么肯定不正常,原因可能有二:
1)IO路径上的硬件出问题了,比如硬盘坏了(只有少数情况会导致长期D,通常会返回错误);
2)内核自己出问题了。
这种问题一旦出现就通常不可恢复,kill不掉,通常只能重启恢复了。
内核针对这种开发了一种hung task的检测机制,基本原理是:定时检测系统中处于D状态的进程,如果其处于D状态的时间超过了指定时间(默认120s,可以配置),则打印相关堆栈信息,也可以通过proc参数配置使其直接panic。
默认的方式下linux会把文件访问的时间atime做记录,文件系统在文件被访问、创建、修改等的时候记录下了文件的一些时间戳,比如:文件创建时间、最近一次修改时间和最近一次访问时间;这在绝大部分的场合都是没有必要的。
因为系统运行的时候要访问大量文件,如果能减少一些动作(比如减少时间戳的记录次数等)将会显著提高磁盘 IO 的效率、提升文件系统的性能。
如果遇到机器IO负载高或是CPU WAIT高的情况,可以尝试使用noatime和nodiratime禁止记录最近一次访问时间戳。
给挂在home下的磁盘批量设置noatime
sed -ri 's/(/home.s+.s+)S+(s+[[:digit:]]+s+[[:digit:]]+)/1noatime2/' /etc/fstab
http://blog.csdn.net/beginning1126/article/details/41983547
http://m.blog.chinaunix.net/uid-30272819-id-5180838.html
io优化参考:
http://syswift.com/124.html
在线对kvm进行限速:
virsh blkdeviotune vm10.39.10.90 hda --total-iops-sec 500 --live --total-bytes-sec 52428800
修改配置文件.xml,在指定disk 内添加
52428800
500
需要关闭虚拟机后重启生效。也可使用动态先进行生效。
sed -i "/target dev='hda'/an52428800n500n " *.xml
带宽限制: