sysctl 是一个用于在运行时检查和修改内核参数的命令。它允许用户读取和修改内核参数,以便优化系统性能
1. 使用sysctl查看 Kernel 参数
查看所有的当前内核参数
sysctl -a
具体参数有很多
...
vm.max_map_count = 65530
vm.memory_failure_early_kill = 0
vm.swappiness = 10
vm.user_reserve_kbytes = 131072
vm.vfs_cache_pressure = 100
vm.watermark_scale_factor = 10
vm.zone_reclaim_mode = 0
查看指定参数
sysctl 参数名
如
sysctl vm.swappiness
该参数控制换出运行时内存的相对权重
输出
vm.swappiness = 10
也可以使用 grep
命令来搜索特定的参数,例如:
sysctl -a | grep "net.ipv4.ip_forward"
输出
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
上述参数分别表示是否开启路由转发功能和巨型帧转发功能
2. 使用sysctl修改 Kernel 参数
设置指定内核参数的值
sysctl -w parameter=value
如
sysctl -w net.ipv4.ip_forward=1
修改立即生效,但不是持久化的。在系统重启后,默认值会被重新加载,要永久修改参数,需要修改设置到配置文件/etc/sysctl.conf
sysctl -w net.ipv4.ip_forward=1 >> /etc/sysctl.conf
也可以使用echo命令将设置写入到/proc/sys目录下的文件中
echo 1 > /proc/sys/net/ipv4/ip_forward
使用-p
从一个配置文件中加载设置
sysctl -p dir
如果没有给定dir
,默认从 /etc/sysctl.conf 中读取配置
3. 示例:优化网络性能
以下是一些可以用 sysctl 命令优化网络性能的参数示例:
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
sysctl -w net.ipv4.tcp_wmem="4096 65536 16777216"
sysctl -w net.ipv4.tcp_no_metrics_save=1
这些命令分别调整了接收和发送缓冲区的最大值,TCP 套接字的内存使用,以及下次新建立相同连接的时候是否使用保存的参数来初始化这个连接。要使这些更改永久生效,将它们添加到 /etc/sysctl.conf
文件中,并运行 sysctl -p
命令
4. Linux内核参数分类介绍
Linux内核参数是控制Linux系统行为的变量。它们可以通过/proc/sys/目录下的文件进行修改。
4.1. 网络相关参数
这些参数控制网络协议栈的行为。
-
net.ipv4.tcp_tw_reuse:重用处于TIMEWAIT状态的TCP连接。
-
net.ipv4.tcp_tw_recycle:启用TIMEWAIT端口的快速回收。如果开启此选项,请确保任何应用程序都可以处理端口重用(也就是说,它们必须使用SO_REUSEPORT或SO_REUSEADDR)。
-
net.core.somaxconn:控制连接队列的最大长度。连接队列是连接的插队者的缓冲区,即未完成的三次握手的连接的队列。
-
net.ipv4.tcp_wmem:TCP发送缓冲区的大小,最小,默认和最大值分别是:4096、12582912、33554432 bytes
-
net.ipv4.tcp_rmem:TCP接收缓冲区的大小,最小,默认和最大值的分别是:4096、87380、16777216 bytes
-
net.ipv4.tcp_window_scaling:允许使用TCP窗口缩放。
-
net.ipv4.tcp_sack:在TCP中启用选择性ACK(SACK)。
-
net.core.rmem_max:系统全局TCP接收缓冲池大小的最大值(字节),默认值为212992 bytes。
-
net.core.wmem_max:系统全局TCP发送缓冲池大小的最大值(字节),默认值为212992 bytes。
-
net.core.rmem_default:系统全局TCP接收缓冲池的默认大小(字节),默认值为124928 bytes。
-
net.core.wmem_default:系统全局TCP发送缓冲池的默认大小(字节),默认值为124928 bytes。
-
net.ipv4.tcp_syncookies:启用tcpsyncookies代替原生TCP SYN cookie的启发式算法以抵御SYN flood攻击。
-
net.ipv4.tcp_fin_timeout:控制TCP连接终止时的超时时间。如果发现TCP连接处于TIMEWAIT状态很长时间,你可以将这个参数进行修改,默认值是 60s。
-
net.ipv4.tcp_keepalive_time:TCP Keep-Alives (保活)时间(单位为秒),默认为7200(即两个小时)。
-
net.ipv4.tcp_keepalive_intvl:在tcp_keepalive_time之后,没有接收到对方确认,继续发送保活探测包的发送间隔,默认为75秒。
-
net.ipv4.tcp_keepalive_probes:在tcp_keepalive_time之后,最大允许发送保活探测包的次数,到达此次数后直接放弃尝试,并关闭连接,默认为9次。
-
net.ipv4.ip_local_port_range:TCP和UDP使用的本地端口号范围。默认情况下,前者为 32768-60999,后者为 32768-61000。
-
net.ipv6.conf.all.disable_ipv6:用于禁用IPv6接口。
-
net.ipv6.conf.all.forwarding:用于启用(1)或禁用(0)IPv6 网络数据包的转发。
-
net.ipv6.conf.default.disable_ipv6:用于禁用默认IPv6接口。
-
net.ipv6.conf.default.forwarding:默认 IPv6 接口的网络数据包转发开关。
-
net.ipv6.conf.eth0.disable_ipv6:用于禁用名为eth0的接口上的IPv6。
-
net.ipv6.conf.eth0.forwarding:名为eth0的接口的IPv6网络数据包转发开关。
-
net.ipv6.conf.lo.disable_ipv6:用于禁用环回设备上的IPv6。
-
net.ipv6.conf.lo.forwarding:环回设备的IPv6网络数据包转发开关。
-
net.ipv6.conf.sit0.disable_ipv6:用于禁用SIT(simple internet transition)设备上的IPv6。
-
net.ipv6.conf.sit0.forwarding:SIT设备的IPv6网络数据转发开关。
4.2. 系统内存相关参数
这些参数控制系统内存的使用。
-
vm.swappiness:控制换出运行时内存的相对权重。值越高,系统会积极地将进程写入交换分区。
-
vm.dirty_ratio:设置脏缓存的最大可用内存量。当缓存超过这个值时,内核会尝试写入所有缓存内存。此参数设置为默认值60,表示内核将在全局RAM达到可用RAM的60%时,自动开始flushing页缓存和写回脏缓存,以最小化swap-out操作和其性能影响。
-
vm.dirty_background_ratio:当脏缓存超过此内存使用率时,系统将开始写回脏缓存。在此参数为默认值时,它等于vm.dirtyratio的一半(即30)。
-
vm.overcommit_memory:控制何时内存超出限制。当设置为0时,内存分配是基于实际可用的物理内存加上交换空间的大小。当设置为1时,内存分配允许超过可用物理RAM的大小,使用交换空间来满足进程的内存需求。而设置为2时,内存分配将总是超过可用物理RAM的大小
-
vm.dirty_background_bytes:代表内存中脏数据占用内存的大小,单位为字节。当内存中脏数据所占比例高于该值时,内核会将新数据直接写入磁盘,而不等待之前的脏数据写入完毕。
-
vm.dirty_bytes:代表内存中脏数据所占用的内存大小,单位为字节。
-
vm.dirty_expire_centisecs:代表内存中脏数据的过期时间,单位为ms。当脏数据在内存中存储的时间超过这个时间,则必须写入磁盘,以释放内存。
-
vm.dirty_time_expire_seconds:代表内存中脏数据的允许存储时间,单位为秒。当脏数据在内存中存储的时间超过这个时间,则必须写入磁盘,以释放内存。
-
vm.dirty_writeback_centisecs:代表脏数据从内存写入磁盘的时间间隔,单位为ms
-
vm.drop_caches:用于释放内存中的缓存,包括buffer/cache。
-
vm.highmem_isdirtyable:代表系统是否允许高内存页(大于896MB)被标记为脏数据并写入磁盘
-
vm.legacy_va_layout:用于启用或禁用内核虚拟地址布局,在64位系统上使用
-
vm.lowmem_reserve_ratio:代表系统内存保留的比例,即内存保留给内核使用的比例
-
vm.max_map_count:代表系统可以拥有的最大内存映射数
-
vm.memory_failure_early_kill:用于捕获内存错误和失败,并停止受影响的进程。
-
vm.memory_failure_recovery:用于恢复内存错误和失败。
-
vm.min_free_kbytes:代表不允许内存使用小于该值的空闲内存(以KB为单位)。
-
vm.nr_hugepages:代表系统的巨型页面数量。
-
vm.nr_overcommit_hugepages:代表系统过度提交的巨型页面数量。
-
vm.nr_pdflush_threads:用于控制 pdflush 进程的数量。
-
vm.oom_dump_tasks:用于是否打印内存溢出时的堆栈跟踪信息。
-
vm.oom_kill_allocating_task:表示是否在出现内存溢出时终止分配内存的进程。
-
vm.overcommit_kbytes:用于指定过度提交的内存空间大小。
-
vm.panic_on_oom:用于控制系统在发生内存溢出时是否自动停机。
-
vm.percpu_pagelist_fraction:代表分配给每个CPU的页列表的内存比例。
-
vm.vfs_cache_pressure:用于控制系统在内存使用达到一定限制时释放系统缓存占用的页缓存、目录缓存和 inode 缓存
4.3. 块设备和文件系统参数
这些参数影响块设备和文件系统的表现。
-
fs.file-max:系统最大打开文件数。默认值为 65536。
-
fs.nr_open:控制单个进程可以打开的文件描述符的最大数量。如果系统经常运行大量并发的NIO(非阻塞I/O)操作,则需要调整该参数
-
blkdev.max_open: 每个块设备驱动程序所允许打开的最大块设备文件数。默认值为 1024。
-
vm.block_dump: 开启此选项后,内核会记录所有页面交换和文件写入的情况,并输出到 /var/log/syslog 文件中。默认值为 0,表示关闭记录。
-
fs.inotify.max_queued_events: inotify 事件队列的最大长度。默认值为 16384。
-
fs.inotify.max_user_instances: 每个用户最多能同时打开的 inotify 文件数。默认值为 128。
-
fs.inotify.max_user_watches: 每个用户最多能同时监视的文件数。默认值为 8192。
4.4. 其他参数
这些参数不属于特定的类别
-
kernel.printk:控制系统日志的输出级别。
-
kernel.sysrq:控制系统是否启用 sysrq 键用于触发各种系统调试和管理功能
-
kernel.corepattern:设置生成的内核转储文件的名称和目录。
-
kernel.coreusespid:将与内核转储文件关联的进程ID添加到文件名中。
-
kernel.pid_max: 进程 ID 的最大值。默认值为 2^22。
-
kernel.shmmax: 每个共享内存区段能够使用的最大内存量,单位为字节。默认值为 RAM 的一半。
-
kernel.shmall: 共享内存区段最大使用的总内存量,单位为 4096 字节的页数。默认值为 4GB / 4096 = 1048576。