操作系统参数配置

本文档为 Nebula Graph 系统参数配置参考。

ulimit

ulimit -c

此命令调整 core dump 文件可占用空间的最大值。建议设置为 unlimited,即:ulimit -c unlimited

ulimit -n

此命令调整进程最大可用的文件句柄数。建议设置到 10 万以上,如: ulimit -n 130000

内存

vm.swappiness

内核将一段时间内 idle 的匿名页交换至磁盘的倾向性。值越大,越倾向于换出。建议设置为 0,即在内存紧张时,优先淘汰 page cache。注意,swappiness 为 0,不代表不会换出。

vm.min_free_kbytes

Linux 内核根据该选项计算内存相关水位值。如果系统物理内存较大,建议调高该值(比如,128GB 物理内存设置为 5GB)。否则,在内存紧张时,系统无法申请较大的连续物理内存。

vm.max_map_count

此选项指定进程允许的最大 vma (virtual memory area) 数量。系统默认值通常为 65530,绝大多数情况是足够的。如果在内存消耗较大时出现内存申请失败,可以适当调高。

vm.overcommit_memory

该选项指定系统中申请的内存大于可用内存时的内核行为,建议使用系统默认值 0 或 1。不要设置为 2。

vm.dirty_*

这些选项控制系统脏页(dirty page cache)落盘的激进程度。对于写入密集的场景,可以根据需要(吞吐优先还是延时优先)做适当调整。建议使用系统默认值。

Transparent Huge Page

为了更好的延时表现,建议将内存透明大页及锁片整理禁掉。选项分别为 /sys/kernel/mm/transparent_hugepage/enabled/sys/kernel/mm/transparent_hugepage/defrag。例如:

  1. echo never > /sys/kernel/mm/transparent_hugepage/enabled
  2. echo never > /sys/kernel/mm/transparent_hugepage/defrag
  3. swapoff -a && swapon -a

网络

net.ipv4.tcp_slow_start_after_idle

此选项默认值为 1,即 TCP 连接在 Idle 一段时间之后,发送窗口会被重设,并重新执行慢开始算法。建议将该选项设置为 0,尤其是长肥链路(即高延时大带宽)。

net.core.somaxconn

该选项与 listen 系统调用的 backlog 参数一起,指定“已完成三次握手但未被 accept”的最大 TCP 连接数。对于有大量突发连接建立的场景,建议设置为 1024 以上(默认值为 128)。

net.ipv4.tcp_max_syn_backlog

最大 TCP 半连接数,设置原则同 net.core.somaxconn

net.core.netdev_max_backlog

网卡接受队列的最大长度。对于高吞吐场景,尤其是 10G 网卡,建议设置为 10000 以上(默认值为 1000)。

net.ipv4.tcp_keepalive_*

TCP 连接的 keepalive 机制相关参数。对于使用 4 层透明 load balancer 的应用,如果出现 idle 连接意外断开的情况,可以将 tcp_keepalive_timetcp_keepalive_intvl 调低。

net.ipv4.tcp_rmem/wmem

TCP 连接的最小、默认、最大接受/发送 buffer 的大小。对于长肥链路,建议调大默认值为 bandwidth * RTT。

scheduler

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

其他

kernel.core_pattern

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

相关命令使用说明

sysctl

  • sysctl conf_name 查看当前参数值
  • sysctl -w conf_name=value 修改参数值并立即生效
  • sysctl -p 从相关配置文件加载参数值

ulimit 使用说明

ulimit 命令用于设置当前 shell session 的资源限制阈值。需要注意的是,

  • ulimit 命令做出的修改仅对当前 session (及子进程)有效。
  • ulimit 不能将某个资源的(soft)阈值调整至大于当前 hard 值。
  • 普通用户不能通过该命令调整 hard 阈值(包括 sudo 方式)。
  • 若要从系统层面修改,或者调整 hard 阈值,需要编辑 /etc/security/limits.conf 文件。但该方式需要重新登录才能生效。

prlimit

prlimit 命令可以修改某个特定进程的资源限制阈值。结合 sudo 命令可以修改 hard 阈值。例如, prlimit --nofile=130000 --pid=$$ 可将当前进程最大允许打开的文件数调整至 14000,并立即生效。请注意该命令仅在 RedHat 7u 或更新版本 OS 可用。