leevis.com
leevis.com copied to clipboard
Linux 内核参数优化
概览
作为http服务需要优化的系统参数。
优化
- 文件句柄
# vim /etc/security/limits.conf
* soft nofile 655350
* hard nofile 655350
- 最大文件数
echo 2861022 > /proc/sys/fs/file-max
- TCP参数调优 修改后sysctl -p /etc/sysctl.conf生效。
# vim /etc/sysctl.conf
net.ipv4.ip_local_port_range = 1024 65000 #表示TCP/UDP协议允许使用的本地端口号
net.core.rmem_default = 256960 #默认的TCP数据接收窗口大小(字节)
net.core.rmem_max = 513920 #最大的TCP数据接收窗口(字节)
net.core.wmem_default = 256960 #默认的TCP数据发送窗口大小(字节)
net.core.wmem_max = 513920 #最大的TCP数据发送窗口(字节)
net.core.netdev_max_backlog = 2000 #在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.somaxconn = 2048 #定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数
net.core.optmem_max = 81920 #表示每个套接字所允许的最大缓冲区的大小
net.ipv4.tcp_mem = 131072 262144 524288 #确定TCP栈应该如何反映内存使用,每个值的单位都是内存页(通常是4KB)。第一个值是内存使用的下限;第二个值是内存压力模式开始对缓冲区使用应用压力的上限;第三个值是内存使用的上限。在这个层次上可以将报文丢弃,从而减少对内存的使用。对于较大的BDP可以增大这些值(注意,其单位是内存页而不是字节)
net.ipv4.tcp_rmem = 8760 256960 4088000 #为自动调优定义socket使用的内存。第一个值是为socket接收缓冲区分配的最少字节数;第二个值是默认值(该值会被rmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是接收缓冲区空间的最大字节数(该值会被rmem_max覆盖)
net.ipv4.tcp_wmem = 8760 256960 4088000 #为自动调优定义socket使用的内存。第一个值是为socket发送缓冲区分配的最少字节数;第二个值是默认值(该值会被wmem_default覆盖),缓冲区在系统负载不重的情况下可以增长到这个值;第三个值是发送缓冲区空间的最大字节数(该值会被wmem_max覆盖)
net.ipv4.tcp_keepalive_time = 1800 #TCP发送keepalive探测消息的间隔时间(秒),用于确认TCP连接是否有效
net.ipv4.tcp_keepalive_intvl = 30 #探测消息未获得响应时,重发该消息的间隔时间(秒)
net.ipv4.tcp_keepalive_probes = 3 #在认定TCP连接失效之前,最多发送多少个keepalive探测消息
net.ipv4.tcp_sack = 1 #启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用
net.ipv4.tcp_fack = 1 #启用转发应答,可以进行有选择应答(SACK)从而减少拥塞情况的发生,这个选项也应该启用
net.ipv4.tcp_timestamps = 1 #CP时间戳(会在TCP包头增加12个字节),以一种比重发超时更精确的方法(参考RFC 1323)来启用对RTT 的计算,为实现更好的性能应该启用这个选项
net.ipv4.tcp_window_scaling = 1 #启用RFC 1323定义的window scaling,要支持超过64KB的TCP窗口,必须启用该值(1表示启用),TCP窗口最大至1GB,TCP连接双方都启用时才生效
net.ipv4.tcp_syncookies = 1 #表示是否打开TCP同步标签(syncookie),内核必须打开了CONFIG_SYN_COOKIES项进行编译,同步标签可以防止一个套接字在有过多试图连接到达时引起过载
net.ipv4.tcp_tw_reuse = 1 #表示是否允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接
net.ipv4.tcp_tw_recycle = 1 #能够更快地回收TIME-WAIT套接字
net.ipv4.tcp_fin_timeout = 30 #对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间(秒)。对方可能会断开连接或一直不结束连接或不可预料的进程死亡
net.ipv4.tcp_max_syn_backlog = 2048 #对于还未获得对方确认的连接请求,可保存在队列中的最大数目。如果服务器经常出现过载,可以尝试增加这个数字
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_tw_timeout=3 #收缩TIME_WAIT状态socket的回收时间窗口
net.netfilter.nf_conntrack_max = 2097152 #conntrack默认最大跟踪数
# 80端口禁止连接跟踪
// iptables -A INPUT -m state --state UNTRACKED,ESTABLISHED,RELATED -j ACCEPT
// iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
// iptables -t raw -A OUTPUT -p tcp --sport 80 -j NOTRACK
- 其他
# 判断是物理机还是虚拟机
dmidecode -s system-product-name
或者lshw -class system
或者dmesg | grep -I virtual
# 查看CPU型号
dmidecode -s processor-version
# 查看物理CPU的个数
cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l
# 查看物理CPU是几核
cat /proc/cpuinfo |grep "cores"|uniq
# 查看cpu逻辑核个数
cat /proc/cpuinfo |grep "processor"|wc -l
# 查看是否万兆网卡
ethtool eth0 |grep Speed
# 查看网卡PCI设备号
ethtool -i eth0 |grep 'bus-info'
# 查看PCIE网卡所属的NUMA node
lspci -vvvs <bus-info> |grep 'NUMA node'
# 查看NUMA node 对应的core区间
lscpu
# 查看网络流量
sar -n DEV interval count
IFACE:LAN接口
rxpck/s:每秒钟接收的数据包
txpck/s:每秒钟发送的数据包
rxbyt/s:每秒钟接收的字节数
txbyt/s:每秒钟发送的字节数
# 防火墙相关
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
systemctl status firewalld.service # 查看firewall状态
# 查看conntrack最大数和当前连接数
sysctl -a | egrep "conntrack_max|conntrack_count"
# 设置
echo 262144 > /sys/module/nf_conntrack/parameters/hashsize
# 查看CPU模式, cpufreq是动态调整cpu的模块,会生成一个/sys/devices/system/cpu/cpu[0-x]/cpufreq/ 目录
其中scaling_min_freq 文件代表最低频率
scaling_max_freq 代表最高频率
scaling_governor 为cpu调整模式,可以取值:
- performance: CPU频率固定工作在其支持的最高运行频率上,不动态调整。
- powersave: 将CPU频率设置为最低的所谓“省电”模式,不动态调整。
- userspace: 系统将变频策略的决策权交给了用户态应用程序
- ondemand: 按需快速动态调整CPU频率
- conservative: 平滑地调整CPU频率
cat /sys/devices/system/cpu/cpu[0-7]/cpufreq/scaling_governor
- 网卡多队列
查看网卡支持多少个队列
grep eth0 /proc/interrupts |awk '{print $NF}'
$ ethtool -l eth0
Channel parameters for eth0:
Pre-set maximums:
RX: 0
TX: 0
Other: 0
Combined: 60 # 网卡支持设置60个队列
Current hardware settings:
RX: 0
TX: 0
Other: 0
Combined: 60 #网卡目前设置了60个队列
- 查看irq
grep eth0 /proc/interrupts | awk '{print $1}' | tr -d :
- 查看中断绑定的cpu核
cat /proc/irq/<$irq>/smp_affinity_list
centos 安装ixgbe 下载ixgbe。make
# make
报一下错误:
common.mk:81: *** Kernel header files not in any of the expected locations.
common.mk:82: *** Install the appropriate kernel development package, e.g.
common.mk:83: *** kernel-devel, for building kernel modules and try again。 停止。
# yum install gcc kernel-header kernel-devel
# ln -s /usr/src/kernels/3.10.0-327.el7.x86_64/ /usr/src/linux
# make
参考: https://cloud.tencent.com/developer/article/1156204 https://www.sunmite.com/linux/update-ixgbe-on-centos.html https://blog.csdn.net/sky101010ws/article/details/52387856 https://www.liritian.com/2019/04/16/linux-性能优化思路/ https://aws.amazon.com/cn/blogs/compute/optimizing-network-intensive-workloads-on-amazon-ec2-a1-instances/
利用set_irq_affinity 设置网卡多队列。
- 其他命令
# 监控内核台内存占用
slabtop
# 查看证书域名
openssl x509 -text -noout -in |grep DNS
# 查看证书有效期
openssl x509 -enddate -noout -in
# 查看oom panic
sysctl -a |grep vm.panic_on_oom
# oom几秒后panic
sysctl -a |grep kernel.panic
# 检查系统哪些进程容易被oom kill掉
#!/bin/bash
# Displays running processes in descending order of OOM score
printf 'PID\tOOM Score\tOOM Adj\tCommand\n'
while read -r pid comm; do [ -f /proc/$pid/oom_score ] && [ $(cat /proc/$pid/oom_score) != 0 ] && printf '%d\t%d\t\t%d\t%s\n' "$pid" "$(cat /proc/$pid/oom_score)" "$(cat /proc/$pid/oom_score_adj)" "$comm"; done < <(ps -e -o pid= -o comm=) | sort -k 2nr
网卡多队列。reuseport。 才是nginx性能关键