调整页面分配
/proc/sys/vm/min_free_kbytes 预留的最小进程空间,一般无法被创建使用。一般不用调,实在不行就调小一点。
调整内存的过量使用,尤其在虚拟化中:
/proc/sys/vm/overcommit_memory 参数有0 1 2,意义如下:
0 启发式过量使用,系统自己决定要不要使用
1 总是过量使用,一上来就开swap。一般在数据库服务器上不要使用swap,太慢了。但是这也要看情况,向hadoop这样的分布式系统又可以开。。。
2 提交的RAM总量是加上了swap。这个值要跟ratio配合使用。
/proc/sys/vm/overcommit_ratio 可超出物理内存的百分之多少,跟2配合使用,一般不要超过50(加起来就是150%),也不能超过swap空间。后果很严重,会导致内存溢出,称为OOM。超出了之后内核会启动一个叫OOM killer的进程,会杀死大内存的进程。
/proc/sys/vm/panic_on_oom 0表示开启,1表示关闭.
调整网络io的arp缓存
默认arp解析结果都缓存在 /proc/net/arp中. 软限制是512个,超出会被5秒钟删除。硬限制是1024。ARP通常缓存5分钟。一个C网只有254台主机,遇到超大型网络再调ARP。如果ARP不够用时,网络会经常刷新。所谓调优都是为极端场景准备的,一般别乱调。
查看当前主机上缓存了多少个条目,用 ip neighbor list
清楚设备上的缓存条目: ip neighbor flush dev ethX
一般真不怎么用!
调整参数:n et.ipv4.default.gc_thresh1 default 128 超过了垃圾回收器也不要管;
net.ipv4.default.gc_thresh2 default 512 软限制,可以超过,但马上回删掉;
net.ipv4.default.gc_thresh3 硬限制,不可以超过。
/proc/sys/vm/ vfs_cache_pressure 控制内核回收目录和inode的机制。 值越高越容易回收目录和iNode这两个值。0~100,倾向于不回收,>100 倾向于回收。=0 绝对不回收。一般来说回收了可以及时释放内存空间,保留的话系统性能很好。
/proc/sys/vm/page-cluster 页簇,一次性交换多少个页面到交换分区swap。这个值是幂次,比如page-cluster=3表示一次交换出2^3个页面。默认就是3,一般不要大于4,在频繁使用swap时,可以调大这个值,跑虚拟机的时候会比较有用。
调整pdflush线程
脏页概念:当进程修改了缓存中的数据而未同步到硬盘中,称为脏页。pdflush把脏页洗进内存为保证数据的一致性。
pdflush:清洗内存中的脏页到磁盘上去的,按需启动。系统一般自个儿就启动了。
/proc/sys/vm/vm.nr_pdflush_threads表示当前启动了多少个pdflush线程。一般情况下,最忙的时候一个IO设备给一个,系统会自动管理的,不用调。但是他的一些 工作属性要调,比如什么时候启动起来?怎么工作?
dirty_background_ratio 脏页占了总缓存的多大比例之后开启pdflush。
dirty_background_bytes 脏页达到多少字节后开启pdflush
dirty_ratio 单个进程所占的脏页占到总缓存的多少比例开启pdflush。
dirty_expire_centisecs 百分秒, 每隔多长时间起来一次。默认是3000,就是30秒
dirty_writeback_centisecs 当一个脏页存在多久时被刷到硬盘中。百分秒。
以上都在/proc/sys/vm/下面
先同步完了后释放,不然数据会丢失的。
手动完成清洗脏页:
sync
或者 echo s > /proc/sysrq-trigger
回收:
echo 3 > /proc/sys/vm/drop_caches
参数解释:1 释放pagecache 2 释放dentries和inodes 3 释放pagecache dentries inodes。一般就用参数1就好了,dentries和inodes对系统性能有提升。
一般消息和共享内存调的多点。
进程间通信管理命令:
ipcs -l 看当前的限定
ipcs -p看进程的
ipcs -c看创见者
ipcrm 万一通信的时候有个进程睡眠了,唤醒不了,使用该命令可移除一个消息队列。删除进程。
共享内存的可调参数:
kernel.shmni: 在全系统范围内最大允许使用多少个共享内存段。这个参数经常调,特别是针对数据库服务,default=4096,有点小。
kernel.shmall: 全局范围内,一次性可使用的最大共享内存页面数。最小等于shmmax/pages default=2097152
kernel.shmmax:可被创建的(单个)共享内存段的最大大小。
kernel.msgmnb: 单个消息队列的最大字节数,字节。default=16384
kernel.msgmni:系统范围内,最大消息队列数。default=16
kernel.msgmax: 单个消息的最大上限,上面两个相乘。default=8192
以上按需调整,一般都往大里调。 用ipcs测试,不够了就往上调大。
使用valgrind评估内存泄漏,用来调试或priofile应用程序的。它有很多组件,用--tool来指定组件的名称,默认组件是memcheck,后面跟上某个进程。
valgrind --tool=memcheck cat /proc/$$/maps 检查当前进程是否有内存泄漏。(内存分出去了,程序不用了却没有释放)
显示all heap blocks were freed --no leaks are possible 表示无内存泄露
内核泄漏的两种类型:
virtual:进程要求但是没有用到的地址空间(vsize)
real:进程释放失败的内存(rss)
另一种方法检查内存泄漏:
watch -n1 'ps axo pid,comm,rss,vszie | grep httpd' 主要观察rss和vsize,一般都为0
如何提高swap的性能?
降低swap的think time
降低访问次数,就是不要使用swap
使用多个交换分区(要有多个硬盘), 在多个硬盘中划分swap,同时使用,优先级设为相同。如果某个设备慢的话就降低优先级
比如在/etc/fstab中加入:
/dev/sda1 swap swap pri=5 0 0
/dev/sdb1 swap swap pri=5 0 0
testswap swap swap pri=5 0 0
/dev/sdc1 swap swap pri=1 0 0
使用交换内存的概率:
vm.swappiness 使用交换匿名页到swap中的百分比,当这个值加上映射到页表中的内存百分比大于100时,就会把匿名页交换到swap。调大未必好。内存不够用的话,还是调大点吧。
使用多大swap合适?
如果是批处理系统,4倍ram
如果是数据库服务器,小于1G,当然不用最好
如果是应用服务器,大于0.5倍ram