Linux 内核参数
本文介绍 Linux 内核参数相关知识。
内核参数设置
Linux 操作系统修改内核参数有以下三种方式:
-
修改
/etc/sysctl.conf
文件;在文件中加入配置项,格式为
key = value
,保存修改后的文件,执行命令sysctl -p
加载新配置。 -
使用 sysctl 命令临时修改;
如:
sysctl -w net.ipv4.tcp_mem = "379008 505344 758016"
-
直接修改 /proc/sys/ 目录中的文件。
如:
echo "379008 505344 758016" > /proc/sys/net/ipv4/tcp_mem
注意:第一种方式在重启操作系统后自动永久生效;第二种和第三种方式在重启后失效。
内核参数
kernel.core_uses_pid = 1
core_uses_pid 可以控制 core 文件的文件名中是否添加 pid 作为扩展名。设置为1,表示添加 pid 作为扩展名,生成的 core 文件格式为 core.xxx;设置为0(默认),表示生成的 core 文件统一命名为 core。
kernel.core_pattern = core
core_pattern 可以控制 core 文件的保存位置和文件格式。
如:kernel.core_pattern = "/corefile/core-%e-%p-%t"
,表示将 core 文件统一生成到 /corefile 目录下,产生的文件名为 core-命令名-pid-时间戳。
以下是参数列表:
- %p - insert pid into filename 添加 pid
- %u - insert current uid into filename 添加当前 uid
- %g - insert current gid into filename 添加当前 gid
- %s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
- %t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
- %h - insert hostname where the coredump happened into filename 添加主机名
- %e - insert coredumping executable name into filename 添加命令名
kernel.msgmax = 8192
进程间的消息传递是在内核的内存中进行的。msgmax 指定了消息队列中消息的最大值。(65536B=64KB)
kernel.msgmnb = 16384
msgmnb 规定了一个消息队列的最大值,即一个消息队列的容量。msgmnb 控制可以使用的共享内存的总页数。Linux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 16G,那么需要共享内存页数是16GB / 4KB = 16777216KB / 4KB = 4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求。
kernel.shmall = 1048576
表示在任何给定时刻,系统上可以使用的共享内存的总量(bytes)。
kernel.shmmax = 4294967295
表示内核所允许的最大共享内存段的大小(bytes)。用于定义单个共享内存段的最大值,64位 linux 系统,可取的最大值为物理内存值 - 1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为64GB物理内存,可取64 * 1024 * 1024 * 1024 - 1 = 68719476735。
实际可用最大共享内存段大小=shmmax * 98%,其中大约2%用于共享内存结构。可以通过设置 shmmax,然后执行ipcs -l
来验证。
kernel.sysrq = 0
控制系统调试内核的功能,不同的值对应不同的功能:
- 0 完全禁用 sysrq 组合键
- 1 启用 sysrq 组合键的全部功能
- 2 启用控制台日志级别控制
- 4 启用键盘控制(SAK、unraw)
- 8 启用进程的调试信息输出等
- 16 启用同步命令
- 32 启用重新挂载为只读
- 64 启用进程信号(终止、杀死、溢出杀死)
- 128 允许重启/关机
- 256 控制实时任务的优先级控制(nicing)
net.core.netdev_max_backlog = 262144
表示当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许发送到队列的数据包的最大数目。
net.core.rmem_default = 8388608
为 TCP socket 预留用于接收缓冲的内存默认值。
net.core.rmem_max = 16777216
为 TCP socket 预留用于接收缓冲的内存最大值。
net.core.somaxconn = 128
listen(函数)的默认参数,挂起请求的最大数量限制。web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到128。nginx 服务器中定义的 NGX_LISTEN_BACKLOG 默认为511。
net.core.wmem_default = 8388608
为 TCP socket 预留用于发送缓冲的内存默认值。
net.core.wmem_max= 16777216
为 TCP socket 预留用于发送缓冲的内存最大值。
net.ipv4.conf.all.accept_source_route = 0、net.ipv4.conf.default.accept_source_route = 0
处理无源路由的包。
net.ipv4.conf.all.rp_filter = 1、net.ipv4.conf.default.rp_filter = 1
开启反向路径过滤。
net.ipv4.ip_forward = 0、net.ipv4.conf.all.send_redirects = 0、v4.conf.default.send_redirects = 0
不充当路由器。
net.ipv4.icmp_echo_ignore_broadcasts = 1
避免放大攻击。
net.ipv4.icmp_ignore_bogus_error_responses = 1
开启恶意 ICMP 错误消息保护。
net.ipv4.ip_local_port_range = 1024 65535
增加系统 IP 端口限制。表示用于向外连接的端口范围。参考
net.ipv4.tcp_fin_timeout = 30
如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外宕机。缺省值是 60s,2.2 内核通常是 180s,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的 WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN-WAIT-2 的危险性比 FIN-WAIT-1 要小,因为它最多只能吃掉 1.5k 内存,但是它们的生存期长些。
net.ipv4.tcp_keepalive_time = 1200
表示当 keepalive 起作用的时候,TCP 发送 keepalive 消息的频度。(单位:秒,缺省值:2小时)
net.ipv4.tcp_max_orphans = 3276800
表示系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的 DoS 攻击,不能郭飞依赖依靠它或者认为地减小这个值,如果增加了内存之后,更应该增加这个值。
net.ipv4.tcp_max_syn_backlog = 262144
记录的是那些尚未收到客户端确认信息的连接请求的最大值。对于有 128M 内存的系统而言,缺省值是 1024,小内存的系统则是 128。
net.ipv4.tcp_max_tw_buckets = 6000
表示系统同时保持 TIME_WAIT 套接字的最大数量,默认是 180000。
net.ipv4.tcp_mem = 94500000 915000000 927000000
确定 TCP 栈应该如何反映内存使用;每个值的单位都是内存页(通常是 4KB):
- 第一个值是内存使用的下限。
- 第二个值是内存压力模式开始对缓冲区使用应用压力的上限。
- 第三个值是内存上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的 BDP 可以增大这些值(但是要记住,其单位是内存页,而不是字节)。
net.ipv4.tcp_sack = 1
启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。
net.ipv4.tcp_synack_retries = 1
为了打开对端的连接,内核需要发送一个 SYN 并附带一个回应前面一个 SYN 的 ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送 SYN+ACK 包的数量。
net.ipv4.tcp_syncookies = 1
开启 SYN 洪水攻击保护。
net.ipv4.tcp_syn_retries = 1
在内核放弃建立连接之前发送 SYN 包的数量。
net.ipv4.tcp_timestamps = 0
该参数用于设置时间戳,可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。设置为 0 表示将其关掉。
net.ipv4.tcp_tw_recycle = 0
是否开启 TCP 连接中 TIME-WAIT sockets 的快速回收,0 表示关闭,1 表示开启。当 tcp_tw_recycle 与 tcp_timestamp 同时开启时会降低连接成功率。
net.ipv4.tcp_tw_reuse = 1
是否开启重用,允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,0 表示关闭,1 表示开启。
net.ipv4.tcp_window_scaling = 1
启用 RFC 1323 定义的 window scaling,要支持超过 64KB 的 TCP 窗口,必须启用该值(1表示启用),TCP窗口最大至 1GB,TCP 连接双方都启用时才生效。
net.ipv6.conf.all.disable_ipv6 = 1、net.ipv6.conf.default.disable_ipv6 = 1
禁用 IPv6