Contents

linux压测配置优化

背景

临时租赁服务器,进行灰度压测,进行大量并发cURL.测试机器压榨单机极限性能.

修改单进程句柄限制

查看进程最大文件数

# 查看进程最大文件数
ulimit -n

修改进程最大文件数

ulimit -SHn 1048576
  • S 表示设置软限制(soft limit)。软限制是指系统允许进程使用的资源上限,但进程可以尝试超过这个限制。
  • H 表示设置硬限制(hard limit)。硬限制是指系统绝对允许进程使用的资源上限,即使进程尝试超过这个限制,系统也会阻止它。
  • n 表示设置进程可以打开的文件描述符的最大数量
# 防止重启后失效
echo ulimit -HSn 1048576 >> /etc/rc.local
echo ulimit -HSn 1048576 >>/root/.bash_profile

ulimit影响因素

  • fs.nr_open;进程最大文件描述符数
  • fs.file-max;系统最大文件描述符数

修改/etc/sysctl.conf

#  /etc/sysctl.conf
fs.file-max = 1048576 
fs.nr_open=1048576

nf_conntrack_max 开启

防止配置net.nf_conntrack_max报错

# 校验conntrack是否开启
lsmod |grep conntrack
# 开启 ip_conntrack
modprobe ip_conntrack

/etc/sysctl.conf配置修改

# 套接字优化
# 每个套接字的缓冲区大小
net.core.optmem_max= 81920
# 套接字接收缓冲区大小
net.core.rmem_max=513920
# 套接字发送缓冲区大小 
net.core.wmem_max=513920
# TCP 接收缓冲区大小 
net.ipv4.tcp_rmem=4096 87380 16777216
# TCP 发送缓冲区大小
net.ipv4.tcp_wmem=4096 65536 16777216
# UDP 缓冲区范围
net.ipv4.udp_mem=188562 251418 377124

# 提高请求数优化
# 处于 TIME_WAIT 状态的连接数量
net.ipv4.tcp_max_tw_buckets=1048576
# 连接跟踪表的大小;控制整个系统的连接跟踪表大小
net.netfilter.nf_conntrack_max = 1048576
# 越小系统尽快释放它们所占用的资源
net.ipv4.tcp_fin_timeout = 10
# 越小系统尽快释放它们所占用的资源
net.netfilter.nf_conntrack_tcp_timeout_time_wait =30
# 端口复用
net.ipv4.tcp_tw_reuse = 1
#端口范围限制
net.ipv4.ip_local_port_range = 1024 65000

# 控制单个网络接口的连接跟踪表大小
net.nf_conntrack_max = 1048576

# 暂未确定
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_no_metrics_save=1
net.core.somaxconn = 65535
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_max_orphans = 262144
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1

# 长连接优化
# 缩短最后一次数据包到 Keepalive 探测包的间隔时间
net.ipv4.tcp_keepalive_time=600
# 减少Keepalive 探测失败后,一直到通知应用程序前的重试次数 
net.ipv4.tcp_keepalive_probes=3
# 缩短发送 Keepalive 探测包的间隔时间
net.ipv4.tcp_keepalive_intvl=30

修改后使其生效

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

/sbin/sysctl -w net.ipv4.route.flush=1