跳转至

Linux 内核配置

本文介绍与 NebulaGraph 相关的 Linux 内核配置,并介绍如何修改配置。

资源控制

虽然可以用ulimit进行资源控制,但是所做的更改仅对当前会话或子进程生效。如果需要永久生效,请编辑文件/etc/security/limits.conf。配置如下:

# <domain>     <type>      <item>          <value>
*              soft         core           unlimited    
*              hard         core           unlimited   
*              soft         nofile          130000   
*              hard         nofile          130000

Note

配置修改后会对新的会话生效。

参数说明如下。

参数 说明
domain 控制域。可以是用户名称、用户组名称(以@开头),或者用*表示所有用户。
type 控制类型。可以是softhardsoft表示资源的软阈值(默认阈值),hard表示用户可以设置的最大值。可以使用ulimit命令提高soft,但不能超过hard
item 资源类型。例如core限制核心转储文件的大小,nofile限制一个进程可以打开的最大文件描述符数量。
value 资源限制值。可以是一个数字,或者 unlimited 表示没有限制。

可以执行man limits.conf查看更多帮助信息。

内存

vm.swappiness

vm.swappiness是触发虚拟内存(swap)的空闲内存百分比。值越大,使用 swap 的可能性就越大,建议设置为 0,表示首先删除页缓存。需要注意的是,0 表示尽量不使用 swap。

vm.min_free_kbytes

vm.min_free_kbytes用于设置 Linux 内核保留的最小空闲千字节数。如果系统内存足够,建议设置较大值。例如物理内存为 128 GB,可以将vm.min_free_kbytes设置为 5 GB。如果值太小,会导致系统无法申请足够的连续物理内存。

vm.max_map_count

vm.max_map_count用于限制单个进程的 VMA(虚拟内存区域)数量。默认值为65530,对于绝大多数应用程序来说已经足够。如果应用程序因为内存消耗过大而报错,请增大本参数的值。

vm.dirty_*

vm.dirty_*是一系列控制系统脏数据缓存的参数。对于写密集型场景,用户可以根据需要进行调整(吞吐量优先或延迟优先),建议使用系统默认值。

透明大页

透明大页(Transparent Huge Pages, THP)是一种 Linux 内核的内存管理特性,可以提高系统使用大页的能力。在多数数据库系统中,透明大页会降低性能,建议关闭。

操作如下:

  1. 编辑 GRUB 配置文件/etc/default/grub

    sudo vi /etc/default/grub
    
  2. GRUB_CMDLINE_LINUX选项中添加transparent_hugepage=never,然后保存并退出。

    GRUB_CMDLINE_LINUX="... transparent_hugepage=never"
    
  3. 更新 GRUB 配置。

    • CentOS

      sudo grub2-mkconfig -o /boot/grub2/grub.cfg
      
    • Ubuntu

      sudo update-grub
      
  4. 重启操作系统。

    sudo reboot
    

    如果不重启可临时关闭透明大页,直到下次重启。

    echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
    echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
    

网络

net.ipv4.tcp_slow_start_after_idle

net.ipv4.tcp_slow_start_after_idle默认值为 1,会导致闲置一段时间后拥塞窗口超时,建议设置为0,尤其适合大带宽高延迟场景。

net.core.somaxconn

net.core.somaxconn用于限制 socket 监听的连接队列数量。默认值为128。对于有大量突发连接的场景,建议设置为不低于1024

net.ipv4.tcp_max_syn_backlog

net.ipv4.tcp_max_syn_backlog用于限制处于 SYN_RECV(半连接)状态的 TCP 连接数量。默认值为128。对于有大量突发连接的场景,建议设置为不低于1024

net.core.netdev_max_backlog

net.core.netdev_max_backlog用于限制队列中数据包的数量。默认值为1000,建议设置为10000以上,尤其是万兆网卡。

net.ipv4.tcp_keepalive_*

net.ipv4.tcp_keepalive_*是一系列保持 TCP 连接存活的参数。对于使用四层透明负载均衡的应用程序,如果空闲连接异常断开,请增大tcp_keepalive_timetcp_keepalive_intvl的值。

net.ipv4.tcp_wmem/rmem

TCP 套接字发送/接收缓冲池的最小、最大、默认空间。对于大连接,建议设置为带宽 (GB) *往返时延 (ms)

scheduler

对于 SSD 设备,建议将scheduler设置为noop或者none,路径为/sys/block/DEV_NAME/queue/scheduler

其他参数

kernel.core_pattern

建议设置为core,并且将kernel.core_uses_pid设置为1

修改参数

sysctl 命令

  • sysctl <conf_name>

    查看当前参数值。

  • sysctl -w <conf_name>=<value>

    临时修改参数值,立即生效,重启后恢复原值。

  • sysctl -p [<file_path>] 

    从指定配置文件里加载 Linux 系统参数,默认从/etc/sysctl.conf加载。

prlimit

命令prlimit可以获取和设置进程资源的限制,结合sudo可以修改硬阈值,例如,prlimit --nofile=140000 --pid=$$调整当前进程允许的打开文件的最大数量为140000,立即生效,此命令仅支持 RedHat 7u 或更高版本。


最后更新: September 6, 2024