刚才看了百度同学的分享,觉得挺有意思。试着总结一下:
征兆:
1. system cpu占用率偏高。
2. 执行命令 用ps -o majflt,minflt -C program命令查看,majflt或者minflt每秒增量很大。
原因:
频繁的分配释放内存,导致缺页中断次数很高。而缺页中断的处理是由系统在内核态完成的,所以system cpu利用率偏高,导致性能问题的产生。
解决办法:
将动态内存改为静态分配,或者启动的时候,用malloc为每个线程分配,然后保存在threaddata里面。但是,由于这个模块的特殊性,静态分配,或者启动时候分配都不可行。另外,Linux下默认栈的大小限制是10M,如果在栈上分配几M的内存,有风险。
禁止malloc调用mmap分配内存,禁止内存紧缩。
在进程启动时候,加入以下两行代码:
mallopt(M_MMAP_MAX, 0); // 禁止malloc调用mmap分配内存
mallopt(M_TRIM_THRESHOLD, -1); // 禁止内存紧缩
注意:
1. Linux内存分配,在超过128K时,就会调用mmap,而不是移动brk指针。当munmap时,会把内存释放掉。
2. 释放掉的内存数大于128K时,会调用brk紧缩逻辑。
以上两点都会把内存释放掉,导致下次申请内存时还会产生缺页中断。
原帖地址:http://topic.csdn.net/u/20100325/16/0b86c0ed-5b8d-4eec-a757-c782ae9a3a35.html