[草稿] 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 ????