在 Linux 系统安装后,进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作:
修改/etc/sysctl.conf 文件
执行sysctl -p使配置生效。
kernel.shmmax = 135185569792
kernel.shmall = 4294967296
fs.aio-max-nr = 3145728
fs.file-max = 6815744
kernel.shmmni = 4096
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
kernel.panic_on_oops = 1
net.ipv4.ipfrag_high_thresh=41943040
net.ipv4.ipfrag_low_thresh=40894464
net.ipv4.ipfrag_time=60
kernel.sem = 1024 60000 1024 128
#based on best practice
net.ipv4.ipfrag_high_thresh=41943040
net.ipv4.ipfrag_low_thresh=40894464
net.ipv4.ipfrag_time=60
kernel.sem = 1024 60000 1024 128
#if there are issue like the one described in note 2163270.1
vm.dirty_background_ratio=1
vm.dirty_ratio=3
以下是对这些 sysctl.conf
配置项的详细解释:
共享内存相关参数
kernel.shmmax = 135185569792
- 内涵:
kernel.shmmax
定义了单个共享内存段(Shared Memory Segment)能够分配的最大字节数。共享内存是一种进程间通信(IPC)机制,多个进程可以访问同一块物理内存区域,从而实现高效的数据共享。 - 意义:在需要大量数据共享的应用场景中,如数据库管理系统,较大的
shmmax
值可以避免因共享内存段大小限制而导致的性能问题或错误。该值设置为135185569792
字节(约 126GB),为应用程序提供了较大的共享内存空间。
kernel.shmall = 4294967296
- 内涵:
kernel.shmall
表示系统范围内可以使用的共享内存页面总数。页面是操作系统进行内存管理的基本单位,不同系统的页面大小可能不同(通常为 4KB 或 8KB)。 - 意义:该参数限制了系统中所有共享内存段的总大小。通过设置合适的
shmall
值,可以确保系统有足够的页面来支持共享内存的使用。这里设置为4294967296
,允许系统使用较多的共享内存页面。
kernel.shmmni = 4096
- 内涵:
kernel.shmmni
定义了系统中可以同时存在的共享内存段的最大数量。 - 意义:在多进程共享内存的场景中,限制共享内存段的数量可以防止系统资源被过度占用。设置为
4096
意味着系统最多可以创建 4096 个共享内存段。
文件系统相关参数
fs.aio-max-nr = 3145728
- 内涵:
fs.aio-max-nr
表示系统中可以同时存在的异步 I/O(Asynchronous I/O)请求的最大数量。异步 I/O 允许应用程序在发起 I/O 请求后继续执行其他任务,而不必等待 I/O 操作完成。 - 意义:对于需要处理大量并发 I/O 请求的应用程序,如数据库和文件服务器,增加该参数的值可以提高系统的 I/O 处理能力。设置为
3145728
允许系统同时处理较多的异步 I/O 请求。
fs.file-max = 6815744
- 内涵:
fs.file-max
定义了系统中可以同时打开的文件描述符的最大数量。文件描述符是操作系统用于标识打开文件的整数,每个打开的文件、套接字等都有一个对应的文件描述符。 - 意义:在高并发的应用场景中,如 Web 服务器,可能会同时打开大量的文件和套接字。增加
fs.file-max
的值可以避免因文件描述符耗尽而导致的错误。
网络相关参数
net.ipv4.ip_local_port_range = 9000 65500
- 内涵:
net.ipv4.ip_local_port_range
指定了系统在创建 TCP 或 UDP 套接字时可以使用的本地端口号范围。端口号是用于标识网络应用程序的 16 位整数,范围从 0 到 65535。 - 意义:默认情况下,系统使用的本地端口号范围可能较小,在高并发的网络环境中可能会导致端口号耗尽。通过扩大本地端口号范围,可以增加系统的并发连接能力。这里将范围设置为
9000
到65500
。
net.core.rmem_default = 262144
和 net.core.rmem_max = 4194304
- 内涵:
net.core.rmem_default
是套接字接收缓冲区的默认大小(以字节为单位),而net.core.rmem_max
是套接字接收缓冲区的最大大小。接收缓冲区用于临时存储从网络接收到的数据。 - 意义:适当调整接收缓冲区的大小可以提高网络数据的接收效率。较大的接收缓冲区可以减少数据丢失的可能性,特别是在网络带宽较高或数据传输速率较快的情况下。
net.core.wmem_default = 262144
和 net.core.wmem_max = 1048586
- 内涵:
net.core.wmem_default
是套接字发送缓冲区的默认大小(以字节为单位),net.core.wmem_max
是套接字发送缓冲区的最大大小。发送缓冲区用于临时存储要发送到网络的数据。 - 意义:调整发送缓冲区的大小可以优化网络数据的发送性能。较大的发送缓冲区可以减少应用程序等待网络发送的时间,提高数据发送的效率。
net.ipv4.ipfrag_high_thresh=41943040
和 net.ipv4.ipfrag_low_thresh=40894464
- 内涵:这两个参数与 IP 分片(IP Fragmentation)有关。当 IP 数据包的大小超过网络接口的最大传输单元(MTU)时,数据包会被分片。
net.ipv4.ipfrag_high_thresh
是 IP 分片缓存的高水位线,当缓存中的分片数据达到该值时,系统会开始丢弃新的分片;net.ipv4.ipfrag_low_thresh
是低水位线,当缓存中的分片数据减少到该值以下时,系统会恢复接收新的分片。 - 意义:通过合理设置这两个参数,可以避免 IP 分片缓存占用过多的系统内存,同时确保在必要时能够正常处理 IP 分片。
net.ipv4.ipfrag_time=60
- 内涵:
net.ipv4.ipfrag_time
表示 IP 分片在缓存中保留的最长时间(以秒为单位)。如果在该时间内所有分片没有全部到达,则会丢弃这些分片。 - 意义:设置合适的分片保留时间可以避免因丢失分片而导致的缓存占用时间过长,提高系统资源的利用率。
内核其他参数
kernel.panic_on_oops = 1
- 内涵:
kernel.panic_on_oops
是一个布尔值参数,当设置为1
时,表示在内核发生严重错误(Oops)时,系统会立即进入崩溃(Panic)状态。 - 意义:在生产环境中,内核错误可能会导致系统不稳定或数据丢失。通过设置该参数,可以在发生严重错误时及时停止系统,避免进一步的问题,并方便进行故障排查。
kernel.sem = 1024 60000 1024 128
- 内涵:
kernel.sem
用于设置 System V 信号量(Semaphores)的相关参数,这四个值分别表示:- 每个信号量集(Semaphore Set)中允许的最大信号量数量。
- 系统范围内允许的最大信号量数量。
- 每个信号量集的最大操作数量。
- 系统范围内允许的最大信号量集数量。
- 意义:信号量是一种用于进程同步和互斥的机制。通过调整这些参数,可以满足不同应用程序对信号量的需求,避免因信号量资源不足而导致的错误。
虚拟内存相关参数
vm.dirty_background_ratio=1
和 vm.dirty_ratio=3
- 内涵:
vm.dirty_background_ratio
表示当系统中脏页(Dirty Pages,即已修改但尚未写入磁盘的内存页面)的比例达到该值时,内核会启动一个后台进程将脏页写入磁盘;vm.dirty_ratio
表示当脏页比例达到该值时,应用程序在进行写操作时会被阻塞,直到部分脏页被写入磁盘。 - 意义:适当调整这两个参数可以平衡内存使用和磁盘 I/O 性能。较小的值可以减少脏页在内存中停留的时间,降低数据丢失的风险,但可能会增加磁盘 I/O 负担;较大的值可以减少磁盘 I/O 次数,但可能会导致系统在崩溃时丢失更多的数据。
这些内核参数的调整旨在优化系统的性能、稳定性和资源利用率,以满足不同应用场景的需求。