当面试官问:Linux 内核参数如何优化?你该如何破局?

引言

在工作与面试场景中,内核相关知识占据着极为重要的地位,因此我特别希望能和大家分享这方面的内容。掌握了以下要点,应对面试中的内核相关问题基本不会有太大困难。

开始

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