针对Linux内核参数调优,增加补充的详细说明,便于大家更好的理解
1. 调整文件描述符限制
# 临时生效
ulimit -n 65534
# 永久生效,编辑 /etc/security/limits.conf
* soft nofile 65534
* hard nofile 65534
说明:
ulimit -n
:设置当前会话的最大文件描述符数。nofile
:指定每个用户进程的最大文件描述符数。
好处:
增加文件描述符限制有助于服务器在高并发连接情况下保持稳定,避免“too many open files”错误。
2. TCP参数调优
# 编辑 /etc/sysctl.conf
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 6291456
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
说明及好处:
net.core.somaxconn
:设置listen()调用中指定的挂起连接队列的最大长度。增大该值可以增加高并发下的连接处理能力。net.core.netdev_max_backlog
:当内核收到数据包的速度比处理速度快时,允许的最大队列长度。增大该值可以减少丢包。net.ipv4.tcp_max_syn_backlog
:TCP三次握手未完成队列的最大长度。增加该值可以应对更多的SYN请求。net.ipv4.tcp_fin_timeout
:设置TCP连接在FIN-WAIT-2状态下的超时时间。减小该值可以更快释放资源。net.ipv4.tcp_tw_reuse
:允许TIME-WAIT套接字被重新用于新的TCP连接。可以提高连接重用率。net.ipv4.tcp_tw_recycle
:加速TIME-WAIT sockets的回收。可以提高连接重用率。net.ipv4.tcp_syncookies
:防止SYN洪水攻击。当打开时,系统可以应对更多的SYN请求。net.ipv4.ip_local_port_range
:指定用于外部连接的本地端口范围。扩大范围可以减少端口耗尽的可能性。net.ipv4.tcp_window_scaling
:开启TCP窗口自动调节功能。提高传输速度。net.ipv4.tcp_rmem
:定义TCP套接字接收缓冲区大小。提高接收性能。net.ipv4.tcp_wmem
:定义TCP套接字发送缓冲区大小。提高发送性能。net.core.rmem_max
:定义系统接收缓冲区最大大小。提高接收性能。net.core.wmem_max
:定义系统发送缓冲区最大大小。提高发送性能。
3. 虚拟内存调优
# 编辑 /etc/sysctl.conf
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
vm.overcommit_memory = 1
说明及好处:
vm.swappiness
:设置系统在内存不足时使用swap的倾向。较低的值(如10)意味着尽量使用物理内存,减少swap的使用,提升性能。vm.dirty_ratio
:设置系统开始将脏数据写回磁盘的阈值。减少该值可以减少突发I/O,保持系统响应性。vm.dirty_background_ratio
:设置后台写回进程开始运行的阈值。减少该值可以减少突发I/O,保持系统响应性。vm.overcommit_memory
:定义内存分配策略。值为1时,允许超量分配内存。适用于需要大量内存的应用。
上述3个内容可以执行使用,下面几个按需测试后使用。
4. I/O调优
# 编辑 /etc/sysctl.conf
vm.dirty_expire_centisecs = 1500
vm.dirty_writeback_centisecs = 100
# 调整I/O调度器
echo noop > /sys/block/sda/queue/scheduler
# 或者
echo deadline > /sys/block/sda/queue/scheduler
说明及好处:
-
vm.dirty_expire_centisecs
:定义脏数据在写回之前可以停留在内存中的时间。减少该值可以减少数据丢失的风险。 -
vm.dirty_writeback_centisecs
:定义后台写回进程运行的间隔。减少该值可以减少脏数据的堆积。 -
noop
:I/O调度器,不做任何调度,适用于SSD。 -
deadline
:I/O调度器,提供确定的I/O响应时间,适用于数据库应用。
5. 网络接口调优
# 调整网卡队列长度
ethtool -G eth0 rx 4096 tx 4096
# 中断平衡
echo 1 > /proc/irq/XX/smp_affinity # 其中XX是网络接口的IRQ号
说明及好处:
ethtool -G
:设置网卡的接收(rx)和发送(tx)队列长度。增大队列长度可以减少丢包。smp_affinity
:定义中断请求(IRQ)在多核CPU上的分布。开启中断平衡可以提高多核CPU的效率。
6. 进程调度调优
# 适合高并发应用的调度策略
echo "cfq" > /sys/block/sda/queue/scheduler
说明及好处:
cfq
(完全公平队列):适合高并发应用,提供更好的I/O性能。
应用并加载新的内核参数
sysctl -p
说明及好处:
sysctl -p
:加载/etc/sysctl.conf
中的配置,使新配置立即生效。
这些配置根据不同的应用场景和需求进行了优化,可以帮助Linux服务器在各种负载条件下发挥最佳性能。实际使用中需要根据具体情况进行微调和测试。