引言
在工作与面试场景中,内核相关知识占据着极为重要的地位,因此我特别希望能和大家分享这方面的内容。掌握了以下要点,应对面试中的内核相关问题基本不会有太大困难。
开始
1. 内存管理优化
vm.swappiness
- 作用: 该参数控制内核在物理内存使用接近满载时,将数据交换(swap)到磁盘的频率。值越高,系统越倾向于进行交换;值越低,系统在面临较大内存压力时才会进行交换。
- 推荐值: 通常设置在
10-60
(默认值为 60)。对于内存密集型应用(如数据库),建议将此值设低。 - 命令:
sysctl -w vm.swappiness=10
vm.dirty_background_ratio 和 vm.dirty_ratio
- 作用: 这两个参数控制脏页(已修改但未写回磁盘的数据)的最大比例。
vm.dirty_background_ratio
定义了系统开始将脏页写回磁盘的触发阈值,而vm.dirty_ratio
则是写操作的上限。 - 推荐值:
vm.dirty_background_ratio = 10,vm.dirty_ratio = 20-40
- 命令:
sysctl -w vm.dirty_background_ratio=10
sysctl -w vm.dirty_ratio=20
vm.min_free_kbytes
- 作用: 指定内核保留的内存量,以防止系统内存完全耗尽,避免进入 OOM(Out of Memory)状态。
- 推荐值: 通常设置为系统总内存的
1%-2%
,可以根据系统实际情况进行调整。 - 命令:
sysctl -w vm.min_free_kbytes=65536
vm.overcommit_memory
作用: 控制内存分配策略。该参数有三个值:
0
:允许内存过度提交,但在分配时会检查是否有足够的内存。1
:始终允许内存过度提交(不检查实际内存)。2
:禁止内存过度提交,分配内存时需要考虑实际内存。
推荐值:
vm.overcommit_memory=2
适用于大多数生产环境,尤其是在运行数据库等内存密集型应用时。命令:
sysctl -w vm.overcommit_memory=2
2. 进程调度优化
kernel.sched_latency_ns
- 作用: 控制调度器延迟,即任务调度时的最大延迟。该参数决定调度器在处理实时任务时的延迟。
- 推荐值: 在需要低延迟的场景中使用,默认值通常已足够。
- 命令:
sysctl -w kernel.sched_latency_ns=5000000
(5ms)
kernel.sched_min_granularity_ns
- 作用: 控制 CPU 时间片的最小粒度。该参数决定调度器分配给每个任务的最小时间。
- 推荐值:
sysctl -w kernel.sched_min_granularity_ns=20000000
(20ms)
kernel.sched_wakeup_granularity_ns
- 作用: 定义进程被唤醒时重新调度的时间间隔,适用于减少高负载系统中的上下文切换。
- 推荐值:
sysctl -w kernel.sched_wakeup_granularity_ns=15000000
(15ms)
kernel.sched_tunable_scaling
- 作用: 启用动态调整调度器参数的功能,以自动根据系统负载优化调度器行为。
- 推荐值:
sysctl -w kernel.sched_tunable_scaling=1
3. 文件系统优化
vm.vfs_cache_pressure
- 作用: 该参数控制内核回收用于缓存的内存的力度。值越大,内核倾向于回收更多的缓存内存;值越小,系统保留更多的缓存,提高文件系统的缓存效果。
- 推荐值: 通常设置为
50
(默认值为 100),在需要频繁访问文件系统缓存的环境中,可以适当降低该值以提高系统性能。 - 命令:
sysctl -w vm.vfs_cache_pressure=50
fs.file-max
- 作用: 此参数定义系统允许的最大文件描述符数量。对于需要处理大量并发连接的应用(如网络服务器或数据库),增加此值可以提高系统的处理能力。
- 推荐值: 根据应用需求进行调整,默认值通常为
1,000,000
。在高并发环境下,可以增加到2,097,152
。 - 命令:
sysctl -w fs.file-max=2097152
4. 网络性能优化
net.core.somaxconn
- 作用: 控制系统允许的最大连接请求队列长度。这决定了在 TCP 连接请求被处理前,系统可以接受的最大挂起请求数量。
- 推荐值: 在高负载环境中,建议设置为
1024
以提升连接处理能力。 - 命令:
sysctl -w net.core.somaxconn=1024
net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem
- 作用: 分别控制 TCP 接收和发送缓冲区的最小、默认和最大大小。这对需要高带宽的网络应用至关重要。
- 推荐值:
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
和sysctl -w net.ipv4.tcp_wmem="4096 87380 16777216"
。这些设置可优化网络吞吐量。 - 命令:
sysctl -w net.ipv4.tcp_rmem="4096 87380 16777216"
net.core.netdev_max_backlog
- 作用: 设置网络接口的最大接收队列长度。在高流量环境下,适当增大此值可以减少丢包现象。
- 推荐值:
sysctl -w net.core.netdev_max_backlog=5000
,以适应更高的网络流量。 - 命令:
sysctl -w net.core.netdev_max_backlog=5000
net.ipv4.tcp_fin_timeout
- 作用: 控制 TCP 连接关闭时的等待时间。通过减少此时间,可以加速连接的释放,降低系统资源的占用。
- 推荐值:
sysctl -w net.ipv4.tcp_fin_timeout=30
,以提高系统的响应速度。 - 命令:
sysctl -w net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_tw_reuse
- 作用: 允许重用处于
TIME_WAIT
状态的 TCP 连接,从而减少系统资源消耗,特别适用于高并发环境。 - 推荐值:
sysctl -w net.ipv4.tcp_tw_reuse=1
,以提升系统资源利用效率。 - 命令:
sysctl -w net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_max_syn_backlog
- 作用: 控制内核在 TCP 连接建立时,最大等待处理的
SYN
包队列长度。对于需要处理大量 TCP 连接的应用,增大此值可以提升连接处理性能。 - 推荐值:
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
,以支持更多的并发连接请求。 - 命令:
sysctl -w net.ipv4.tcp_max_syn_backlog=4096
5. 系统性能优化
kernel.shmmax 和 kernel.shmall
- 作用: 分别控制系统允许的最大共享内存段大小和系统总的共享内存页数。调整这些参数对数据库和大规模数据处理应用的性能至关重要。
- 推荐值: 通常设置为物理内存的
50%-75%
,以充分利用系统资源。 - 命令:
sysctl -w kernel.shmmax=2147483648
sysctl -w kernel.shmall=2097152
fs.inotify.max_user_watches
- 作用: 控制系统中可用的最大
inotify
监听器数量。增加此值可以提高文件系统监控能力,尤其在需要监控大量文件的场景下。 - 推荐值:
sysctl -w fs.inotify.max_user_watches=524288
,以支持更复杂的文件监控任务。 - 命令:
sysctl -w fs.inotify.max_user_watches=524288
6. I/O 性能优化
vm.dirty_background_bytes 和 vm.dirty_bytes
- 作用: 控制内核在将数据写入磁盘之前,保持的脏数据量。
vm.dirty_background_bytes
控制后台刷写的阈值,vm.dirty_bytes
控制刷写的最大数据量。调整这些参数可以优化磁盘写入性能。 - 推荐值: 将
vm.dirty_bytes
设置为更高的值以避免频繁刷写,同时将vm.dirty_background_bytes
设置为较小的值以确保系统及时写回脏数据。 - 命令:
sysctl -w vm.dirty_background_bytes=134217728 ## 128MB
sysctl -w vm.dirty_bytes=268435456 ## 256MB
block.mq-deadline(I/O 调度器)
- 作用: 在磁盘 I/O 操作中,调整调度器策略。
mq-deadline
调度器适用于需要低延迟和高吞吐量的应用,特别是数据库和文件服务器。 - 推荐值: 将调度器设置为
mq-deadline
以提升磁盘读写性能。 - 命令:
echo mq-deadline > /sys/block/sda/queue/scheduler
fs.aio-max-nr
- 作用: 控制系统允许的最大异步 I/O 请求数目。在高并发场景下,增加此值有助于提升 I/O 请求的吞吐能力。
- 推荐值:
sysctl -w fs.aio-max-nr=1048576
以支持更多并发的 I/O 操作。 - 命令:
sysctl -w fs.aio-max-nr=1048576
7. CPU 性能优化
kernel.sched_min_granularity_ns
- 作用: 该参数调整调度器为每个任务分配的最小时间片大小。较大的值可以减少上下文切换,从而提高系统的整体吞吐量;较小的值则可以提升系统的响应速度,使其对交互式应用更为友好。
- 推荐值:
sysctl -w kernel.sched_min_granularity_ns=20000000
(20ms) - 命令:
sysctl -w kernel.sched_min_granularity_ns=20000000
kernel.sched_wakeup_granularity_ns
- 作用: 定义进程被唤醒后重新调度的时间间隔。它有助于减少高负载系统中的上下文切换,特别是在需要处理大量并发任务时,通过延迟唤醒时间来提高系统的效率。
- 推荐值:
sysctl -w kernel.sched_wakeup_granularity_ns=15000000
(15ms) - 命令:
sysctl -w kernel.sched_wakeup_granularity_ns=15000000
cpu.cpuacct.usage
- 作用: 该参数用于跟踪和监控 CPU 使用情况。通过提供详细的使用统计数据,它可以帮助系统管理员识别高负载的进程,从而优化资源分配和提升多核系统的整体性能。
- 推荐值: 该参数主要用于监控,不是直接的优化参数,但在负载均衡和监控系统中非常有用。
8. 文件系统优化
fs.file-max
- 作用: 控制系统中允许的最大文件句柄数量。对于高并发的系统,特别是 Web 服务器和数据库服务器,提高文件句柄数量可以防止因句柄耗尽而导致的系统瓶颈。
- 推荐值:
sysctl -w fs.file-max=2097152
- 命令:
sysctl -w fs.file-max=2097152
fs.inotify.max_user_watches
- 作用: 控制用户可以监控的最大文件数。对于需要监控大量文件的场景(如容器管理、日志管理等),增加此值可以显著提升系统的监控能力和性能。
- 推荐值:
sysctl -w fs.inotify.max_user_watches=524288
- 命令:
sysctl -w fs.inotify.max_user_watches=524288
9. 安全优化
kernel.randomize_va_space
- 作用: 启用地址空间布局随机化(ASLR),通过随机化内存地址布局,增加系统的安全性,防止攻击者轻易猜测内存布局,从而提高系统防御能力。
- 推荐值:
sysctl -w kernel.randomize_va_space=2
- 命令:
sysctl -w kernel.randomize_va_space=2
fs.suid_dumpable
- 作用: 控制是否允许执行 setuid 程序时转储 core 文件。为了提高系统安全性,防止潜在的安全漏洞被利用,建议将其设置为
0
(不允许转储)。 - 推荐值:
sysctl -w fs.suid_dumpable=0
- 命令:
sysctl -w fs.suid_dumpable=0
10. 内核参数和系统资源
kernel.shmmax 和 kernel.shmall
- 作用: 控制共享内存的最大值和总页数。对于需要大量共享内存的应用,如数据库,适当调整这些参数可以确保应用有足够的共享内存资源,提高系统效率。
- 推荐值: 设置为物理内存的
50%-75%
,确保应用的正常运行。 - 命令:
sysctl -w kernel.shmmax=2147483648 ## 2GB
sysctl -w kernel.shmall=2097152 ## 对应 2GB
kernel.msgmni
- 作用: 控制内核消息队列的最大数量。对于消息密集型应用,如 IPC 或消息队列系统,调整此值可确保应用能够高效处理大量消息。
- 推荐值:
sysctl -w kernel.msgmni=1024
- 命令:
sysctl -w kernel.msgmni=1024
11. 高阶 Linux 内核优化参数
kernel.sched_child_runs_first
- 作用: 控制任务的子进程是否优先调度。当设置为
1
时,子进程会优先于父进程调度。这在需要高并发子任务处理的应用场景中,可以提高任务的执行效率。 - 推荐值: 对于计算密集型任务,通常保持默认值
0
,但在多核环境下,可以使用该值提高子进程的调度优先级。 - 命令:
sysctl -w kernel.sched_child_runs_first=1
kernel.sched_idle
- 作用: 控制 Linux 调度器是否允许低优先级任务在空闲时运行。启用此参数时,系统会为空闲任务分配 CPU 时间,适用于不需要即时响应的后台作业,提高系统整体利用率。
- 推荐值: 一般在空闲时间任务较多的环境中使用。默认
0
不启用,只有在有空闲计算需求时启用。 - 命令:
sysctl -w kernel.sched_idle=1
vm.page-cluster
- 作用: 控制内核一次回收多少个页面进行交换。增大该值可以减少交换操作的次数,提高内存效率,特别适用于内存密集型应用,如数据库和大数据处理。
- 推荐值: 默认值通常为
3
,增大该值可以提高高负载环境下的性能。 - 命令:
sysctl -w vm.page-cluster=5
net.core.optmem_max
- 作用: 控制网络套接字接收缓冲区的最大内存使用量。增大此值对高流量的网络应用尤为重要,可以防止因缓冲区溢出导致的数据丢失。
- 推荐值: 对于高负载的 Web 服务或数据库服务器,可以增大此值。
- 命令:
sysctl -w net.core.optmem_max=25165824 ## 24MB
kernel.sysrq
- 作用: 控制
sysrq
按键功能,用于调试和管理系统。启用后,管理员可以在系统出现问题时执行紧急任务,例如重启或查看内存信息,提高系统管理的灵活性。 - 推荐值: 在需要远程恢复和紧急处理的场景下可以启用该功能。一般情况下可以禁用或限制。
- 命令:
sysctl -w kernel.sysrq=1 ## 启用 sysrq 功能
net.ipv4.tcp_max_tw_buckets
- 作用: 控制 TCP 协议栈中
TIME-WAIT
状态的最大桶数。增加该值可以帮助高并发系统更有效地处理大量连接,防止因过多 TIME-WAIT 状态导致的性能瓶颈。 - 推荐值: 对于需要处理大量 TCP 连接的环境,增大此值可以减少连接过多导致的性能瓶颈。
- 命令:
sysctl -w net.ipv4.tcp_max_tw_buckets=1000000
net.ipv4.tcp_fin_timeout
- 作用: 控制 TCP 连接处于
FIN-WAIT-2
状态的最大时间。对于短时间内频繁建立和关闭连接的应用(如高并发的 Web 服务器),适当减小此值可以更快地释放连接资源,提高系统响应速度。 - 推荐值: 减小该值可以更快地关闭连接并释放资源。
- 命令:
sysctl -w net.ipv4.tcp_fin_timeout=15 ## 缩短连接关闭等待时间
net.ipv4.tcp_retries2
- 作用: 控制 TCP 连接在重试失败后的最大重试次数。适用于需要降低 TCP 连接恢复延迟的场景,尤其是在高丢包率的网络环境下,通过减少重试次数来提升连接的响应速度。
- 推荐值: 通常设置为
8-15
,但对于对时延要求较低的应用,可以适当降低此值。 - 命令:
sysctl -w net.ipv4.tcp_retries2=8
fs.file-max
- 作用: 控制 Linux 系统中所有进程可以打开的最大文件描述符数。对于数据库、Web 服务器或其他高并发服务,增加此值可以避免文件描述符耗尽,提高系统的稳定性。
- 推荐值: 根据应用的并发连接数调整,一般为
1,000,000
或更高。 - 命令:
sysctl -w fs.file-max=1000000
vm.dirty_expire_centisecs
- 作用: 控制内核将脏页刷回磁盘的时间。较低的值可以使得系统在低内存时更早地写回磁盘,防止内存过度使用,适用于大规模并发系统,以确保系统稳定运行。
- 推荐值: 默认为
3000
,适用于需要平衡内存和磁盘 I/O 的系统。 - 命令:
sysctl -w vm.dirty_expire_centisecs=2000 ## 提前回写脏页
kernel.panic_on_oops
- 作用: 控制内核在遇到严重错误(如 Oops 错误)时是否自动重启。启用该功能可以确保系统在发生严重故障时自动恢复,减少停机时间,增加系统可靠性。
- 推荐值: 对于生产环境中的关键系统,启用自动重启功能有助于系统自动恢复。
- 命令:
sysctl -w kernel.panic_on_oops=1 ## 启用自动重启
net.ipv6.bindv6only
- 作用: 控制 IPv6 套接字是否只绑定到 IPv6 地址。适用于需要区分 IPv4 和 IPv6 流量的应用程序,确保应用在网络环境中的正确行为。
- 推荐值: 根据具体的网络需求设置此值,IPv4 和 IPv6 共存时可能需要禁用该选项。
- 命令:
sysctl -w net.ipv6.bindv6only=1 ## 启用 IPv6 仅绑定
结语
以上是我们今天讨论的内容,希望能帮助大家在系统优化和面试中游刃有余,从而更好地掌控系统性能,主动出击。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。
文章由技术书栈整理,本文链接:https://study.disign.me/article/202510/11.linux-kernel-params.md
发布时间: 2025-03-05