避免没有必要的缺页中断
用new或者malloc申请内存时,系统并不会立刻分配相应内存,而是在实际使用时才这片内存时才分配。所以为了避免没有必要的缺页中断,可以在申请内存后,立刻初始化一遍内存,避免进程处理业务时产生终端。
使用mlock锁定内存,避免被交换出去。
尽量减少swap或把swap关掉。
https://bingoex.github.io/2016/08/02/linux-memory-2/ https://bingoex.github.io/2016/01/01/linux-memory-1/
减少页表映射
如果物理内存很大,映射表的条目将会非常多,会产生较多TLB Miss,内存访问过程很耗时。例如程序需要访问4MB的内存,那么就需要1024个页面,TLB需要1024个表项,同时需要1024个页表项,系统至少需要产生1024次TLB中断,才可以把4MB内存映射到物理内存。
通常情况下对于大块内存的频繁访问,可以采用大页表减少页表条目,提高内存查询速度
cat /proc/meminfo|grep "HugePages"
可以查看大页表的状态
减少了内存页表项的缓存压力和CPU cache缓存内存地质映射的压力,提高了寻址能力和内存管理效率。大页内存还有其他一些使用时需要注意的地方:
- 大页内存不能交换(SWAP).
- 使用不当时可能造成更大的内存泄漏。
避免伪共享
多核CPU,每个核都拥有独立的L1/L2的缓存,而缓存按照最小单位缓存行进行和内存交互,缓存行一般为64字节。
当多线程修改互相独立的变量(一般出现在全局变量或者一些动态申请的内存)时,如果这些变量共享同一个缓存行,那么当某个核修改缓存行某个变量值时,需要锁定缓存行,同时其他核已经加载该缓存行的cache也跟着失效,需要重新从内存读取。
内存池,减少频繁申请、释放内存
https://bingoex.github.io/2015/09/05/linux-memory-3/