常见的Linux操作系统内核参数

0    552    6

Tags:

👉 本文共约8506个字,系统预计阅读时间或需32分钟。


背景

操作系统为了适应更多的硬件环境,许多初始的设置值,宽容度都很高。

如果不经调整,这些值可能无法适应HPC,或者硬件稍好些的环境。

无法发挥更好的硬件性能,甚至可能影响某些应用软件的使用,特别是数据库。

数据库关心的OS内核参数

512GB 内存为例

1. 参数fs.aio-max-nr

参数解释

推荐设置

2. 参数 fs.file-max

参数解释

推荐设置

3.参数 kernel.core_pattern

参数解释

推荐设置

4. 参数 kernel.sem

参数解释

推荐设置

5. 参数 shmall、shmmax和shmmni

参数解释

推荐设置

6. 参数 net.core.netdev_max_backlog

参数解释

推荐设置

7. 参数 net.core.X

参数解释

推荐设置

8. 参数 net.core.somaxconn

参数解释

推荐设置

9. 参数 net.ipv4.tcp_max_syn_backlog

参数解释

推荐设置

10. 参数net.ipv4.tcp

参数解释

推荐设置

11. 参数 net.ipv4.tcp_mem

参数解释

推荐设置

12. 参数 net.ipv4.tcp_fin_timeout

参数解释

推荐设置

13. 参数 net.ipv4.tcp_synack_retries

参数解释

推荐设置

14. 参数 net.ipv4.tcp_syncookies

参数解释

推荐设置

15. 参数 net.ipv4.tcp_timestamps

参数解释

推荐设置

16.参数 net.ipv4.tcp_X

参数解释

推荐设置

17. 参数 net.ipv4.tcp_rmem

参数解释

推荐设置

18. 参数net.nf_conntrack_max和net.netfilter.nf_conntrack_max

支持系统

参数解释

推荐设置

19. 参数 vm.dirty_X

参数解释

推荐设置

20. 参数 vm.extra_free_kbytes

支持系统

参数解释

推荐设置

21. 参数 vm.min_free_kbytes

参数解释

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

推荐设置

设置方法:

  • echo 4194304 > /proc/sys/vm/min_free_kbytes,或
  • sysctl -w vm.min_free_kbytes=4194304,或
  • 编辑/etc/sysctl.conf文件,加入vm.min_free_kbytes=4194304

常见的Linux操作系统内核参数

内存水位线

Linux系统中,剩余内存有3个水位线,从高到低记为high、low和min。并且有如下的关系:

min = vm.min_free_kbytes,low = min 5 / 4,high = min 3 / 2。

当剩余内存低于high值时,系统会认为内存有一定的压力。当剩余内存低于low值时,守护进程kswapd就会开始进行内存回收。当其进一步降低到min值时,就会触发系统的直接回收(direct reclaim),此时会阻塞程序的运行,使延迟变大。

因此vm.min_free_kbytes的值既不应过小,也不应过大。如果过小(比如只有几十M),low与min之间的差值就会非常小,极易触发直接回收,使效率降低。而如果设置得过大,又会造成内存资源的浪费,kswapd回收时也会耗费更多的时间。上面的语句中设置成了4G,视物理内存大小,一般设在1G~8G之间。

22. 参数 vm.mmap_min_addr

参数解释

推荐设置

23. 参数 vm.overcommit_memory和vm.overcommit_ratio

参数解释

推荐设置

24. 参数vm.swappiness

参数解释

推荐设置

设置方法:

  • echo 0 > /proc/sys/vm/swappiness,或
  • sysctl -w vm.swappiness=0,或
  • 编辑/etc/sysctl.conf文件,加入vm.swappiness=0

swap即交换空间,作用类似于Windows中的虚拟内存,也就是当物理内存不足时,将硬盘上的swap分区当做内存来使用。但是,由于磁盘的读写速率与内存相比差太多,一旦发生大量交换,系统延迟就会增加,甚至会造成服务长期不可用,这对于大数据集群而言是致命的。vm.swappiness参数用于控制内核对交换空间的使用积极性,默认是60。值越高,就代表内核越多地使用交换空间。对于内存较大的CDH集群,我们一般将这个值设为0或1。0表示只有当可用物理内存小于最小阈值vm.min_free_kbytes(后面会提到)时才使用交换空间,1则表示最低限度地使用交换空间。

关于这个配置的具体机制,找到了两种解释:

  • 当物理内存占用率高于(100 - vm.swappiness)%时,开始使用交换分区。
  • vm.swappiness通过控制内存回收时,回收的匿名内存更多一些还是回收的文件缓存更多一些来达到这个效果。如果等于100,表示匿名内存和文件缓存将用同样的优先级进行回收,默认60表示文件缓存会优先被回收掉。

25. 参数 vm.zone_reclaim_mode

参数解释

推荐设置

设置方法:

  • echo 0 > /proc/sys/vm/zone_reclaim_mode,或
  • sysctl -w vm.zone_reclaim_mode=0,或
  • 编辑/etc/sysctl.conf文件,加入vm.zone_reclaim_mode=0

这个参数与NUMA(Non-uniform Memory Access,“非统一性内存访问”)特性有关。

常见的Linux操作系统内核参数

如图所示,NUMA使得每个CPU都有自己专属的内存区域

只有当CPU访问自身直接attach内存对应的物理地址时,才会有较短的响应时间(Local Access)。而如果需要访问其他CPU attach的内存的数据时,就需要通过inter-connect通道访问,响应时间就相比之前变慢了(Remote Access)。NUMA这种特性可能会导致CPU内存使用不均衡,部分CPU的local内存不够使用,频繁需要回收,进而可能发生大量swap,系统响应延迟会严重抖动。而与此同时其他部分CPU的local内存可能都很空闲。这就会产生一种怪现象:使用free命令查看当前系统还有部分空闲物理内存,系统却不断发生swap,导致某些应用性能急剧下降。因此必须改进NUMA的内存回收策略,即vm.zone_reclaim_mode。这个参数可以取值0/1/3/4。其中0表示在local内存不够用的情况下可以去其他的内存区域分配内存;1表示在local内存不够用的情况下本地先回收再分配;3表示本地回收尽可能先回收文件缓存对象;4表示本地回收优先使用swap回收匿名内存。由此可见,将其设为0可以降低swap发生的概率。

26.参数net.ipv4.ip_local_port_range

参数解释

推荐设置

27.参数vm.nr_hugepages

参数解释

推荐设置

28.参数fs.nr_open

参数解释

推荐设置

数据库关心的资源限制

1. 通过/etc/security/limits.conf设置,或者ulimit设置

2. 通过/proc/$pid/limits查看当前进程的设置

数据库关心的IO调度规则

1. 目前操作系统支持的IO调度策略包括cfq, deadline, noop 等。

如果你要详细了解这些调度策略的规则,可以查看WIKI或者看内核文档。

从这里可以看到它的调度策略

修改

或者修改启动参数

从很多测试结果来看,数据库使用deadline调度,性能会更稳定一些。

Linux内核参数

  • 使用 sysctl -w 命令配置为临时生效,写入 /etc/sysctl.conf 配置永久生效。

网络类

参数说明初始化配置
net.ipv4.tcp_tw_recycle该参数用于快速回收 TIME_WAIT 连接。关闭时,内核不检查包的时间戳。开启时则会进行检查。 不建议开启该参数,在时间戳非单调增长的情况下,会引起丢包问题,高版本内核已经移除了该参数。0
net.core.somaxconn对应三次握手结束,还没有 accept 队列时的 establish 状态。accept 队列较多则说明服务端 accept 效率不高,或短时间内突发了大量新建连接。该值过小会导致服务器收到 syn 不回包,是由于 somaxconn 表满而删除新建的 syn 连接引起。若为高并发业务,则可尝试增大该值,但有可能增大延迟。128
net.ipv4.tcp_max_syn_backlog对应半连接的上限,曾用来防御常见的 synflood 攻击,但当 tcp_syncookies=1 时半连接可超过该上限。-
net.ipv4.tcp_syncookies对应开启 SYN Cookies,表示启用 Cookies 来处理,可防范部分 SYN 攻击,当出现 SYN 等待队列溢出时也可继续连接。但开启后会使用 SHA1 验证 Cookies,理论上会增大 CPU 使用率。1
net.core.rmem_default net.core.rmem_max net.ipv4.tcp_mem net.ipv4.tcp_rmem这些参数配置了数据接收的缓存大小。配置过大容易造成内存资源浪费,过小则会导致丢包。建议判断自身业务是否属于高并发连接或少并发高吞吐量情形,进行优化配置。rmem_default 的理论最优配置策略为带宽/RTT 积,其配置会覆盖 tcp_rmem,tcp_rmem 不单独配置。rmem_max 配置约为 rmem_default 的5倍。tcp_mem 为总的 TCP 占用内存,一般由 OS 自动配置为 CVM 可用内存的3/32、1/8或3/16,tcp_mem 及 rmem_default 也决定了最大并发链接数。rmem_default=655360 rmem_max=3276800
net.core.wmem_default net.core.wmem_max net.ipv4.tcp_wmem这些参数用于配置数据发送缓存,腾讯云平台上数据发送通常不会出现瓶颈,可不做配置。-
net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_time这些参数与 TCP KeepAlive 有关,默认为75/9/7200。表示某个 TCP 连接在空闲7200秒后,内核才发起探测,探测9次(每次75秒)不成功,内核才发送 RST。对服务器而言,默认值比较大,可结合业务调整到30/3/1800。-
net.ipv4.ip_local_port_range配置可用端口的范围,请按需调整。-
tcp_tw_reuse该参数允许将 TIME-WAIT 状态的 socket 用于新的 TCP 连接。对快速重启动某些占用固定端口的链接有帮助,但基于 NAT 网络有潜在的隐患,高版本内核变为0/1/2三个值,并配置为2。-
net.ipv4.ip_forward net.ipv6.conf.all.forwardingIP 转发功能,若用于 docker 的路由转发场景可将其配置为1。0
net.ipv4.conf.default.rp_filter该参数为网卡对接收到的数据包进行反向路由验证的规则,可配置为0/1/2。根据 RFC3704建议,推荐设置为1,打开严格反向路由验证,可防止部分 DDos 攻击及防止 IP Spoofing 等。-
net.ipv4.conf.default.accept_source_route根据 CentOS 官网建议,默认不允许接受含有源路由信息的 IP 包。0
net.ipv4.conf.all.promote_secondaries net.ipv4.conf.default.promote_secondaries当主 IP 地址被删除时,第二 IP 地址是否成为新的主 IP 地址。1
net.ipv6.neigh.default.gc_thresh3 net.ipv4.neigh.default.gc_thresh3保存在 ARP 高速缓存中的最多记录的限制,一旦高速缓存中的数目高于设定值,垃圾收集器将马上运行。4096

内存类

参数说明初始化配置
vm.vfs_cache_pressure原始值为100,表示扫描 dentry 的力度。以100为基准,该值越大内核回收算法越倾向于回收内存。很多基于 curl 的业务上,通常由于 dentry 的积累导致占满所有可用内存,容易触发 OOM 或内核 bug 之类的问题。综合考虑回收频率和性能后,选择配置为250,可按需调整。250
vm.min_free_kbytes该值是启动时根据系统可用物理内存 MEM 自动计算出:4 * sqrt(MEM)。其含义是让系统运行时至少要预留出的 KB 内存,一般情况下提供给内核线程使用,该值无需设置过大。当机器包量出现微突发,则有一定概率会出现击穿 vm.min_free_kbytes,造成 OOM。建议大配置的机器下默认将 vm.min_free_kbytes 配置为总内存的1%左右。-
kernel.printk内核 printk 函数打印级别,默认配置为大于5。5 4 1 7
kernel.numa_balancing该参数表示可以由内核自发的将进程的数据移动到对应的 NUMA 上,但是实际应用的效果不佳且有其他性能影响,redis 的场景下可以尝试开启。0
kernel.shmall kernel.shmmaxshmmax 设置一次分配 shared memory 的最大长度,单位为 byte。shmall 设置一共能分配 shared memory 的最大长度,单位为 page。kernel.shmmax=68719476736 kernel.shmall=4294967296

进程类

参数说明初始化配置
fs.file-max fs.nr_open分别控制系统所有进程和单进程能同时打开的最大文件数量:file-max 由 OS 启动时自动配置,近似为10万/GB。nr_open 为固定值1048576,但为针对用户态打开最大文件数的限制,一般不改动这个值,通常设置 ulimit -n 实现,对应配置文件为 /etc/security/limits.conf。ulimit 的 open files 为100001 fs.nr_open=1048576
kernel.pid_max系统内最大进程数,官方镜像默认为32768,可按需调整。-
kernel.core_uses_pid该配置决定 coredump 文件生成的时候是否含有 pid。1
kernel.sysrq开启该参数后,后续可对 /proc/sysrq-trigger 进行相关操作。1
kernel.msgmnb kernel.msgmax分别表示消息队列中的最大字节数和单个最大消息队列容量。65536
kernel.softlockup_panic当配置了 softlockup_panic 时,内核检测到某进程 softlockup 时,会发生 panic,结合 kdump 的配置可生成 vmcore,用以分析 softlockup 的原因。-

IO 类

参数说明初始化配置
vm.dirty_background_bytes vm.dirty_background_ratio vm.dirty_bytes vm.dirty_expire_centisecs vm.dirty_ratio vm.dirty_writeback_centisecs这部分参数主要配置 IO 写回磁盘的策略:dirty_background_bytes/dirty_bytes 和 dirty_background_ratio/dirty_ratio 分别对应内存脏页阈值的绝对数量和比例数量,一般情况下设置 ratio。dirty_background_ratio 指当文件系统缓存脏页数量达到系统内存百分之多少时(默认10%)唤醒内核的 flush 等进程,写回磁盘。dirty_ratio 为最大脏页比例,当脏页数达到该比例时,必须将所有脏数据提交到磁盘,同时所有新的 IO 都会被阻塞,直到脏数据被写入磁盘,通常会造成 IO 卡顿。系统先会达到 vm.dirty_background_ratio 的条件然后触发 flush 进程进行异步的回写操作,此时应用进程仍然可以进行写操作,如果达到 vm.dirty_ratio 这个参数所设定的值,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。 vm.dirty_expire_centisecs 表示脏页能存活的时间,flush 进程会检查数据是否超过了该时间限制,单位为1/100秒。vm.dirty_writeback_centisecs 表示 flush 进程的唤醒周期,单位为1/100秒。-

参考

https://cloud.tencent.com/document/product/213/46400

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部