Linux性能诊断和调优系列(十一)–大内存型应用性能调优案例

Linux性能诊断和调优系列(十一)--大内存型应用性能调优案例

目录

可以使用多少内存?
可以把内存都用光吗?
内存用光时是死机还是杀进程?
使用交换分区的倾向性?
是否使用透明大页?
关于脏页
将应用程序绑定在指定内存上

大内存型常见的场景

大型企业应用程序:企业资源规划(ERP)系统、客户关系管理(CRM)系统等,这些系统需要处理大量事务和数据。
数据分析和数据仓库工具:如Apache Hadoop、Apache Spark等,用于处理和分析大规模数据集。
内存数据库:如SAP HANA、Oracle TimesTen、eXtremeDB等,这些数据库系统将数据主要存储在内存中以提高访问速度。
科学计算和工程模拟软件:如MATLAB、Mathematica、ANSYS等,它们在进行复杂数学模型和工程模拟时需要大量内存。
大数据处理框架:如Apache Flink、Storm等,用于实时处理大量数据流。
所以对于大内存型应用案例,我们重点关注内存方面的调整。

可以使用多少内存?

内存超发是指操作系统可以分配的内存容量超过了你物理内存与交换分区的总容量。这是因为程序通常会不使用分配它们的所有内存(和存储的瘦供给类似),从而允许运行更大、更多的程序,从而提高系统的整体性能和资源利用率。

vm.overcommit_memory,这个参数用于设置内存超发的行为:

0:启发式算法。如果一个进程需要明显太多的内存,就拒绝;但会同意大量的小内存请求,从Linux6开始这个是默认值。
1: 永远超发内存,永远分配内存,不管还有多少剩余。
2: 严格控制内存超发,默认只超发交换分区的150%。
而超过多少容量,可以通过 vm.overcommit_ratio 来设置百分比,或者通过 vm.overcommit_kbytes 来设置绝对值。

可以把内存都用光吗?

vm.min_free_kbytes,这个参数用于设置在内核在开始回收内存之前必须保留的最小空闲内存量。它还负责设置管理 Linux 内核页面回收算法行为的 min_page、low_page 和 high_page 阈值。这会为每个低内存区计算一个特定值,每个值都会被分配一个保留的空闲页面的大小。

内存用光时是死机还是杀进程?

vm.panic_on_oom,这个参数用于设置在内存和交换分区都用光了的时候,是死机还是杀进程。0(默认值)代表内核会尝试杀死一些低优先级的进程来释放内存;设置为1时,内核在遇到内存不足时会触发panic,即导致系统崩溃并重启。
而在内核杀死一些低优先级的进程时,进程的badness得分就是用于在操作系统杀进程时选杀哪个的,得分越高,越可能被杀死。当然内核本身和1号进程是对此免疫。详细信息参见本系列六<<Linux性能诊断和调优系列(六)--网络篇>>。

使用交换分区的倾向性?

vm.swappiness,这个参数用于设置进程使用交换分区的倾向性。值的范围是0到100。值越大,越倾向于使用交换分区,这样IO的性能就会越好;而值越低,就越倾向于尽可能少地使用交换分区,这样文件系统的性能就会越差,而数据库等程序的性能就会越好。

是否使用透明大页?

transparent_hugepages,这个参数用于设置是否启用透明大页。透明大页允许内核自动地将小的内存页合并成更大的页以减少页表的大小,从而提高内存访问效率。从6版本开始,默认就开启了透明大页。它可以设置为always(总是启用)、madvise(通过madvise系统调用启用)或never(禁用)。但是要注意,数据库场景中建议关闭此参数。

关于脏页

vm.dirty_background_ratio,这个参数用于设置当脏页的比例达到这个值时,内核会开始后台写回这些页到磁盘。
vm.dirty_ratio,这个参数用于设置当脏页的比例超过这个值时,内核会尝试立即写回所有的脏页。
vm.dirty_expire_centisecs,这个参数用于设置脏页在被写回之前可以等待的时间,单位是百分之一秒。
vm.dirty_writeback_centisecs,这个参数用于设置当脏页的比例达到vm.dirty_ratio时,内核会在这个时间间隔内写回脏页。

将应用程序绑定在指定内存上

在Linux中,把系统分成node,每个node有自己的CPU和自己的本地内存。
使用numactl可以将程序绑定在特定node上,从而提升性能。
下面的命令是将程序myprogram的内存绑定在node2上,操作系统会尽可能的使用node2的内存。
$ numactl --preferred=2 -- myprogram

更多内容请参见本系列其他文章

<<Linux性能诊断和调优系列(一)--30秒3条命令诊断Linux性能瓶颈>>
<<Linux性能诊断和调优系列(二)--CPU篇>>
<<Linux性能诊断和调优系列(三)--内存篇>>
<<Linux性能诊断和调优系列(四)--硬盘篇>>
<<Linux性能诊断和调优系列(五)--文件系统篇>>
<<Linux性能诊断和调优系列(六)--网络篇>>
<<Linux性能诊断和调优系列(七)--虚拟机及容器篇>>
<<Linux性能诊断和调优系列(八)--虚拟环境性能调优案例>>
<<Linux性能诊断和调优系列(九)--计算密集型应用性能调优案例>>
<<Linux性能诊断和调优系列(十)--存储密集型应用性能调优案例>>
<<Linux性能诊断和调优系列(十一)--大内存型应用性能调优案例>>

本文内容为原创,如需转载,请务必注明原文出处。
更多相关内容,欢迎访问我的个人网站:hongxu.wang。
我们还提供免费的技术支持,欢迎通过公众号与我们联系。

Index
滚动至顶部