当前位置: 首页 > article >正文

ubuntu高并发内核参数调优 - (压测客户端调优)

业务上要求集群提供10w+并发,10w+并发听上去不是很难,但10w并发持续1小时呢
在业务上线之前还需要我们自己对业务进行压测,俗称benchmark。
压测的服务器也是需要进行性能调优的,以下列出调优前后的参数对比,更直观的分析和感受参数对程序的影响

压测前内核参数自检

#!/bin/bash
# 脚本名称: check_benchmark_server_kernel_params.sh
# 描述: 查询压测服务武相关的Linux内核参数的当前值

# 输出格式化函数
print_header() {
  echo -e "\n\033[1;34m$1\033[0m"
  echo "--------------------------------"
}

# 文件描述符和端口范围
print_header "文件描述符和端口范围"
sysctl fs.file-max
sysctl fs.nr_open
sysctl net.ipv4.ip_local_port_range

# TCP连接建立和释放
print_header "TCP连接建立和释放"
sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.core.somaxconn
sysctl net.ipv4.tcp_fin_timeout
sysctl net.ipv4.tcp_syncookies
sysctl net.ipv4.tcp_fastopen 2>/dev/null || echo "net.ipv4.tcp_fastopen: [不支持]"
sysctl net.ipv4.tcp_synack_retries
sysctl net.ipv4.tcp_syn_retries
sysctl net.ipv4.tcp_tw_reuse

# TCP连接保持和超时
print_header "TCP连接保持和超时"
sysctl net.ipv4.tcp_keepalive_time
sysctl net.ipv4.tcp_keepalive_intvl
sysctl net.ipv4.tcp_keepalive_probes
sysctl net.ipv4.tcp_max_tw_buckets

# 内存和缓冲区设置
print_header "内存和缓冲区设置"
sysctl net.core.wmem_max
sysctl net.core.rmem_max
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem
sysctl net.core.optmem_max 2>/dev/null || echo "net.core.optmem_max: [不支持]"

# 网络性能和拥塞控制
print_header "网络性能和拥塞控制"
sysctl net.core.netdev_max_backlog
sysctl net.ipv4.tcp_slow_start_after_idle 2>/dev/null || echo "net.ipv4.tcp_slow_start_after_idle: [不支持]"
sysctl net.ipv4.tcp_mtu_probing
sysctl net.ipv4.tcp_sack
sysctl net.ipv4.tcp_window_scaling
sysctl net.ipv4.tcp_adv_win_scale 2>/dev/null || echo "net.ipv4.tcp_adv_win_scale: [不支持]"
sysctl net.ipv4.tcp_rfc1337 2>/dev/null || echo "net.ipv4.tcp_rfc1337: [不支持]"
sysctl net.ipv4.tcp_congestion_control

# 连接跟踪相关
print_header "连接跟踪相关"
sysctl net.netfilter.nf_conntrack_max 2>/dev/null || echo "net.netfilter.nf_conntrack_max: [未加载conntrack模块]"
sysctl net.netfilter.nf_conntrack_tcp_timeout_established 2>/dev/null || echo "net.netfilter.nf_conntrack_tcp_timeout_established: [未加载conntrack模块]"
sysctl net.netfilter.nf_conntrack_tcp_timeout_time_wait 2>/dev/null || echo "net.netfilter.nf_conntrack_tcp_timeout_time_wait: [未加载conntrack模块]"
sysctl net.ipv4.conf.all.rp_filter

# 其他系统限制
print_header "其他系统限制"
sysctl vm.swappiness
sysctl vm.max_map_count
sysctl kernel.panic 2>/dev/null || echo "kernel.panic: [不支持]"

echo -e "\n脚本执行完毕。请将输出结果保存以便与优化参数进行对比。"

参数修改前后对比表格

压测客户端内核参数与默认值对比表

此表格展示了Linux系统默认内核参数值与已优化的压测客户端参数值的对比。

文件描述符和端口范围

参数默认值优化值变化比例影响
fs.file-max~65536200000030.5倍大幅提高系统可打开的文件描述符总数
fs.nr_open104857620000001.9倍提高单个进程可打开的文件描述符数量

TCP连接建立和释放

参数默认值优化值变化比例影响
net.ipv4.tcp_synack_retries5180%减少减少服务端响应SYN+ACK的重试次数
net.ipv4.tcp_max_syn_backlog10246553664倍极大提高SYN半连接队列容量
net.core.somaxconn12810485768192倍极大提高已完成连接队列容量
net.ipv4.tcp_fin_timeout601575%减少大幅加速FIN_WAIT连接的释放

TCP连接保持和超时

参数默认值优化值变化比例影响
net.ipv4.tcp_keepalive_time72006099%减少极大减少检测失效连接的等待时间
net.ipv4.tcp_keepalive_intvl753060%减少加速keepalive探测间隔
net.ipv4.tcp_keepalive_probes9367%减少减少确认连接失效前的探测次数

内存和缓冲区设置

参数默认值优化值变化比例影响
net.core.wmem_max2129921258291259倍极大提高写缓冲区上限
net.core.rmem_max2129921258291259倍极大提高读缓冲区上限
net.ipv4.tcp_rmem4096 87380 629145610240 87380 12582912最大值增加2倍提高TCP读缓冲区最大值
net.ipv4.tcp_wmem4096 16384 419430410240 87380 12582912最大值增加3倍提高TCP写缓冲区最大值
kernel.msgmnb655361310722倍提高消息队列的最大字节数
kernel.msgmax655361310722倍提高单个消息的最大字节数

网络性能和拥塞控制

参数默认值优化值变化比例影响
net.core.netdev_max_backlog10006553665.5倍极大提高网络设备接收队列容量
net.ipv4.tcp_max_tw_buckets18000014400008倍大幅提高TIME_WAIT状态连接的容量
net.ipv4.tcp_slow_start_after_idle10禁用防止空闲连接重启时的性能下降
net.ipv4.tcp_mtu_probing01启用提高网络路径MTU探测能力

其他系统限制

参数默认值优化值变化比例影响
vm.swappiness601083%减少大幅减少内存交换倾向
vm.max_map_count655302621444倍提高内存映射区域数量上限

参数应用

应用方法
将需要修改的参数添加到 /etc/sysctl.conf 文件或 /etc/sysctl.d/ 目录下的配置文件中,例如创建 /etc/sysctl.d/99-performance.conf,然后执行以下命令使其生效:
sudo sysctl -p /etc/sysctl.d/99-performance.conf
配置文件示例
以下是一个配置文件示例,只包含需要修改的参数:

# 文件描述符和端口范围
fs.file-max = 2000000
fs.nr_open = 2000000
net.ipv4.ip_local_port_range = 1024 65535

# TCP连接建立和释放
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_max_syn_backlog = 65536
net.core.somaxconn = 1048576
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1

# TCP连接保持和超时
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3

# 内存和缓冲区设置
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 87380 16777216
kernel.msgmnb = 131072
kernel.msgmax = 131072
net.ipv4.tcp_mem = 786432 1048576 1572864

# 网络性能和拥塞控制
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_mtu_probing = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_notsent_lowat = 16384

# 其他系统限制
vm.swappiness = 10
vm.max_map_count = 262144

ulimit调整

还需要调优ulimit数量,一般情况下都设置为65535,这里我的服务器基础性能高,所以给更大

vim /etc/security/limits.conf
# End of file
*               soft    nofile          1000000
*               hard    nofile          1000000
root            soft    nofile          1000000
root            hard    nofile          1000000

http://www.kler.cn/a/593344.html

相关文章:

  • Elasticsearch:使用 ColPali 进行复杂文档搜索 - 第 1 部分 - 8.18
  • 解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目
  • Nginx 日志格式
  • docker利用ollama +Open WebGUI在本地搭建部署一套Deepseek-r1模型
  • uniapp路由跳转导致页面堆积问题
  • 涨薪技术|Kubernetes(k8s)之Pod端口设置及资源配额
  • 蓝桥杯 之 拔河(2024年C/C++ B组 H题)
  • Leetcode 50.Pow(x,n) 使用快速幂求解
  • Flask从入门到精通--初始Flask
  • 仓库管理不能仅流于形式,需挖掘潜在价值
  • [科普] git和github等是什么关系 (由DS-R1生成)
  • Android SDK下载安装配置
  • 机器学习快速入门教程
  • 栈/堆/static/虚表
  • Fisher 信息矩阵公式原理:使用似然估计,二阶导数等知识点
  • MySQL 在 CentOS 7 上安装的步骤指南
  • Web3身份验证技术对数据保护的影响研究
  • C#入门学习记录(二)C# 中的转义字符——字符串处理的“魔法钥匙”​
  • QT入门笔记3
  • 这样配置让Nginx更安全