调整页面分配


/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