[草稿] linux内核优化

[TOC]

设置 file-max 最大打开文件数

确认Linux系统级的最大打开文件数限制

cat /proc/sys/fs/file-max
  默认:3260331

查看socket状态

cat /proc/net/sockstat

修改 limits.conf 设置最大描述符

修改limits.conf,设置最大描述符,即设置单个进程打开文件数上限(重启后永久生效):

echo "* - nofile 65536" >> /etc/security/limits.conf

limits.conf的格式:username|@groupname type resource limit,其中 type 有如下3种:

type 解释 备注
soft 当前系统生效的设置值 xxx
hard 当前系统中所能设定的最大值 soft的限制不能比hard限制高
- 同时设置soft和hard的值 xxx

其中,resource有如下11种:

nofile       打开文件的最大数目
core         限制内核文件的大小
rss          最大持久设置大小
stack        最大栈大小
cpu          以分钟为单位的最多CPU时间
noproc       进程的最大数目
date         最大数据大小
fsize        最大文件大小
maxlogins    此用户允许登录的最大数目
memlock      最大锁定内存地址空间
as           地址空间限制

设置 ulimit 最大文件数

关于 ulimit 命令的用法如下:

type 解释 举例
ulimit -n 显示用户可以使用的资源限制 xxx
ulimit -n num 设置用户可以同时打开的最大文件数(max open files) xxx

需要注意的是:

  • ulimit -n num,如果本参数设置过小,对于并发访问量大的网站,可能会出现too many open files的错误.
  • ulimit unlimited,不限制用户可以使用的资源,但本设置对可打开的最大文件数(max open files)和可同时运行的最大进程数(max user processes)无效
  • ulimit -HSn 65536,只对当前会话有效

建议写入开启启动:

cat /etc/rc.local | grep ulimit || echo "ulimit -HSn 65536" >> /etc/rc.local

关闭 selinux

如下2种方式查看 selinux 的状态,若返回 Disabled/Enforcing/Permissive 分别表示

getenforce
sestatus -v

临时设置selinux:

  • setenforce 0 临时关闭,不用重启生效;若selinux正在运行则其状态由Enforcing变为Permissive;

永久启用,请参考:

sed -i '/^SELINUX=/cSELINUX=enforcing' /etc/sysconfig/selinux
cat /etc/sysconfig/selinux | grep "SELINUX="

永久关闭,请参考:

sed -i '/^SELINUX=/cSELINUX=disabled' /etc/sysconfig/selinux
cat /etc/sysconfig/selinux | grep "SELINUX="
setenforce 0

通过 sysctl 修改系统内核参数

关于 sysctl 命令的用法如下:

type 解释 举例
sysctl -a 显示所有内核参数 sysctl -a
sysctl -w 修改某内核参数 sysctl -w fs.file-max = 10240

切记:设置内核参数时务必小心,如果设置不当会导致系统异常,甚至当机。

或者:通过修改sysctl.conf来更改:

# vi /etc/sysctl.conf
fs.file-max = 10240

缓解大量 TIME_WAIT 状态的连接

参数名 建议值 默认值 功能 备注
net.ipv4.tcp_syncookies 1 0,表示关闭 开启SYN cookies 当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击
net.ipv4.tcp_tw_reuse 1 0,表示关闭 开启重用 允许将处于TIME-WAIT状态的sockets重新用于新的TCP连接
对某些快速重启后提示端口已经被使用的服务非常有帮助
net.ipv4.tcp_tw_recycle 1 0,表示关闭 启用timewait快速回收 开启TCP连接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_timestamps 1 1,表示开启 xxx 只有该参数启用,net.ipv4.tcp_tw_recycle开启才能生效
net.ipv4.tcp_fin_timeout 1 60秒 设置保持在FIN_WAIT_2状态的时间 当服务器主动关闭连接时,socket保持在FIN-WAIT-2状态的最大时间

通常,在FIN_WAIT_2情况下接收到FIN进入到TIME_WAIT的情况,tcp_fin_timeout参数对处于TIME_WAIT状态的时间没有任何影响,但将此参数改小,会缩短从FIN_WAIT_2到TIME_WAIT的时间,从而使连接更早地进入TIME_WAIT状态,加速了TIME_WAIT状态套接字的清理速度。

调整TCP存活(keepalive)的几个参数

参数名 建议值 默认值 功能 备注
net.ipv4.tcp_keepalive_time 1200 7200 当启用keepalive的时候,TCP发送消息的频度 单位为秒
net.ipv4.tcp_keepalive_intvl 30 75 当探测没有确认时,重新发送探测的频度 单位为秒
net.ipv4.tcp_keepalive_probes 5 9 TCP发送keepalive探测以确定该连接已经断开的次数 xxx
net.ipv4.tcp_max_tw_buckets 5000 180000 内核持有的状态为TIME_WAIT的最大数量 若超出该值,TIME_WAIT套接字将立刻被清除并打印警告信息
net.ipv4.tcp_max_syn_backlog 8192 1024 调整SYN队列的长度 以容纳更多等待连接的网络连接数
net.ipv4.ip_local_port_range 1024 65535 32768到60999 设置本地端口范围 端口范围的最小值必须大于或等于1024,最大值则应小于或等于65535.

通常,tcp_keepalive_probes乘以tcp_keepalive_intvl决定了一个连接发送了keepalive之后可以有多少时间没有回应。默认情况:如果某个TCP连接在idle 7200秒后,内核才发起probe,如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效。对服务器而言,显然上述值太大。

最佳实践

建议添加到 /etc/rc.local 的参数

[ -f /proc/sys/fs/file-max ] && echo 65535 >/proc/sys/fs/file-max
[ -f /proc/sys/net/ipv4/netfilter/ip_conntrack_max ] && echo 1048576 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
[ -f /proc/sys/net/ipv4/neigh/default/gc_stale_time ] && echo 120 > /proc/sys/net/ipv4/neigh/default/gc_stale_time
[ -f /proc/sys/net/ipv4/neigh/default/gc_thresh1 ] && echo 1024 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
[ -f /proc/sys/net/ipv4/neigh/default/gc_thresh2 ] && echo 4096 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
[ -f /proc/sys/net/ipv4/neigh/default/gc_thresh3 ] && echo 8192 > /proc/sys/net/ipv4/neigh/default/gc_thresh3
[ -f /proc/sys/net/ipv4/tcp_tw_reuse ] && echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

建议写入到 /etc/sysctl.conf 的参数

sdg小焦添加了如下:

cat >> /etc/sysctl.conf << EOF

# kernel optimization
kernel.panic_on_oops = 1
kernel.panic = 1

net.core.somaxconn = 8192
net.core.netdev_max_backlog = 8192
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_westwood = 1
net.ipv4.tcp_bic = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1800
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 30
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 30
vm.min_free_kbytes = 30720

#.add by yoyo yu.
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 5000        #慎重
net.ipv4.tcp_no_metrics_save = 1        #慎重
net.ipv4.tcp_keepalive_time = 1200
EOF

执行 sysctl -p 立即生效

/sbin/sysctl -p /etc/sysctl.conf

网上找的

# kernel optimization
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.core.somaxconn = 16384
net.ipv4.tcp_max_orphans = 16384
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0                   为何不是1?
sysctl -w net.ipv4.route.flush=1      ????
Copyright © www.sqlfans.cn 2023 All Right Reserved更新时间: 2023-06-08 11:02:49

results matching ""

    No results matching ""