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 |
控制类型。可以是soft 或hard 。soft 表示资源的软阈值(默认阈值),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 内核的内存管理特性,可以提高系统使用大页的能力。在多数数据库系统中,透明大页会降低性能,建议关闭。
操作如下:
-
编辑 GRUB 配置文件
/etc/default/grub
。sudo vi /etc/default/grub
-
在
GRUB_CMDLINE_LINUX
选项中添加transparent_hugepage=never
,然后保存并退出。GRUB_CMDLINE_LINUX="... transparent_hugepage=never"
-
更新 GRUB 配置。
-
CentOS
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
-
Ubuntu
sudo update-grub
-
-
重启操作系统。
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_time
和tcp_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 或更高版本。