面试官问你:我想优化 Linux 内核参数,你有哪些建议呢?

系统 Linux
控制内核在物理内存使用满时,交换(swap)到磁盘的频率。数值越高,越倾向于交换数据,数值越低,内存压力更大时才会进行交换。

引言

关于内核这方面确实很想分享下,因为工作中还有面试中这都算是一个大头了,把下面的掌握了,面试基本没什么大问题了。

开始

1. 内存管理优化

vm.swappiness

• 作用: 控制内核在物理内存使用满时,交换(swap)到磁盘的频率。数值越高,越倾向于交换数据,数值越低,内存压力更大时才会进行交换。

• 推荐值: 通常设置为 10-60(默认 60),对于内存密集型应用(如数据库)建议将此值设低。

• 命令: sysctl -w vm.swappiness=10

vm.dirty_background_ratio 和 vm.dirty_ratio

• 作用: 控制脏页(dirty pages,已修改但未写回磁盘的数据)的最大比例。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

• 作用: 控制内存分配的策略。该参数有三个值:

• 推荐值: 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。

• 命令: sysctl -w fs.file-max=2097152

4. 网络性能优化

net.core.somaxconn

• 作用: 控制系统允许的最大连接请求队列长度。该值决定了在 TCP 连接请求被处理之前,最大允许的挂起请求数量。

• 推荐值: 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"

net.core.netdev_max_backlog

• 作用: 设置网络接口的最大接收队列。如果网络流量很大,设置较大的值可以避免丢包。

• 推荐值: sysctl -w net.core.netdev_max_backlog=5000

net.ipv4.tcp_fin_timeout

• 作用: 控制 TCP 连接在关闭时的等待时间。减小此值可以加速连接的关闭,减少过多的 TCP 连接状态。

• 推荐值: sysctl -w net.ipv4.tcp_fin_timeout=30

net.ipv4.tcp_tw_reuse

• 作用: 允许重用 TIME_WAIT 状态的 TCP 连接,减少对系统资源的消耗,尤其是在高并发场景下。

• 推荐值: sysctl -w net.ipv4.tcp_tw_reuse=1

net.ipv4.tcp_max_syn_backlog

• 作用: 控制内核在 TCP 连接建立时,最大等待处理的 SYN 包队列长度。如果应用程序需要处理大量的 TCP 连接,增大该值可以提升 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

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 使用时间的跟踪。增加该值可以用于高负载的多核系统中进行细粒度监控,帮助更精确地了解每个 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 状态的最大桶数。当连接被关闭后,TCP 会进入 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 仅绑定
责任编辑:武晓燕 来源: 云原生运维圈
相关推荐

2024-03-07 17:21:12

HotSpotJVMHot Code

2022-02-11 19:06:29

MySQL索引面试官

2024-09-03 07:58:46

2024-09-03 09:20:45

2023-02-20 08:08:48

限流算法计数器算法令牌桶算法

2021-08-02 08:34:20

React性能优化

2024-07-26 08:10:10

2020-06-22 11:50:38

TCPIP协议

2020-06-17 21:22:56

Serverless面试官架构

2020-04-09 13:38:40

MySQL数据库脏读

2024-04-19 00:00:00

计数器算法限流算法

2024-03-12 14:36:44

微服务HTTPRPC

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2024-02-26 14:07:18

2015-08-13 10:29:12

面试面试官

2020-11-03 07:00:15

性能优化程序员

2020-02-25 16:56:02

面试官有话想说

2021-09-26 10:57:16

集合操作场景

2021-03-24 10:25:24

优化VUE性能

2020-05-28 14:39:48

Stream API中间操作Stream
点赞
收藏

51CTO技术栈公众号