[转帖]Nginx应用调优案例
https://bbs.huaweicloud.com/blogs/146367
1 问题背景
nginx的应用程序移植到TaiShan服务器上,发现业务吞吐量没有达到硬件预期,需要做相应调优。
2 原因分析
l 网卡配置
该应用场景下网络吞吐量大,网卡的配置能对性能提升起到很大的作用。
l 操作系统参数配置
在更换操作系统后,原来的一些调优措施需要重新定制。
l 应用程序调优
从x86切换到arm之后,可以做一些代码层面、编译选项上的调优。
3 解决方案
3.1 网卡调优
3.1.1 中断绑核
中断亲和度描述为可以为特定中断提供响应的一组CPU,如果应用程序可以通过关联到相关的CPU,在相同的CPU上下文中处理接收到的数据包,则可以减少等待时间,提高CPU利用率。
因此,我们可以将处理网卡中断的CPU core设置在网卡所在的NUMA上,从而减少跨NUMA的内存访问所带来的额外开销,提升网络处理性能。
在这个案例中绑核拓扑如下所示:

我们在服务器中搭载了4块1822网卡,每个网卡使用了4个端口,每个端口设置了6个队列。整机有96个CPU逻辑核,与这96个队列一一绑定。
在应用程序上,我们也在nginx.conf中设置worker_processes为96。
3.1.2 使用网卡的TSO特性
TSO(TCP Segmentation Offload)将传出的TCP数据包的分片工作交给网卡来做,这样可以提高大量使用TCP协议传输数据的应用程序的性能。使用了TSO特性后,将为CPU减负,可有效降低发送端的CPU利用率。
我们可以使用ethtool来使能TSO特性:
# /sbin/ethtool –K <ethX> tso on
在这个案例中,我们启用了所有端口的TSO特性以实现更高的吞吐量。
3.1.3 中断聚合
中断聚合通过合并多个接收到的数据包中断事件,将其一起发送到单个中断中,从而减少了网卡生成的中断数量。
增加中断聚合参数将:
l 产生更少的中断。
l 降低CPU利用率。
l 增加响应延时。
l 提高整体吞吐量。
所以在这里我们增大了中断聚合相关参数。
修改方式
使用ethtool -C $eth方法调整中断聚合参数。其中参数“$eth”为待调整配置的网卡设备名称,如eth0,eth1等。
# ethtool -C eth3 adaptive-rx off adaptive-tx off rx-usecs N rx-frames N tx-usecs N tx-frames N
为了确保使用静态值,需禁用自适应调节,关闭Adaptive RX和Adaptive TX。
l rx-usecs:设置接收中断延时的时间。
l tx-usecs:设置发送中断延时的时间。
l rx-frames:产生中断之前接收的数据包数量。
l tx-frames:产生中断之前发送的数据包数量。
3.1.4 TCP协议参数调优
在测试过程中,我们通过perf trace工具捕捉到了sock:sock_exceed_buf_limit事件:
perf trace -e sock:sock_exceed_buf_limit -F 777
这表示内核TCP协议栈中的发送缓冲区已耗尽,发送缓冲区的内存大小成为阻塞应用程序性能的瓶颈。
在 EulerOS中,初始值如下所示:
# cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 524288
# cat /proc/sys/net/ipv4/tcp_wmem
4096 16384 4194304
在这个案例中,我们设置成如下所示的值:
echo '4096 2097152 67108864' > /proc/sys/net/ipv4/tcp_rmem
echo '4096 2097152 67108864' > /proc/sys/net/ipv4/tcp_wmem
之后在测试过程中,没有再监控到sock:sock_exceed_buf_limit事件。
3.2 操作系统调优
我们使用 perf 工具来统计被测试进程的相关信息,发现上下文切换的频率很高,如下所示:
# perf stat -p 60433
Performance counter stats for process id '60433':
3,276.24 msec task-clock # 0.530 CPUs utilized
15,695 context-switches # 0.005 M/sec
0 cpu-migrations # 0.000 K/sec
1,368 page-faults # 0.418 K/sec
6,505,263,989 cycles # 1.986 GHz
2,843,350,035 instructions # 0.44 insn per cycle
<not supported> branches
24,768,205 branch-misses
6.187155520 seconds time elapsed
我们进一步使用perf 工具来监控被测进程,查看其中调度最频繁的部分。
perf sched record -- sleep 1 -p 59467
perf sched script
perf sched latency -s max
我们发现 timer_tick 在 Taishan服务器中占了很高的调度时延,对比x86服务器数据如下所示:
Taishan:
timer_tick:(97) | 7.364 ms | 591 | avg: 0.012 ms | max: 1.268 ms | max at: 710>
X86:
timer_tick:(33) | 0.203 ms | 56 | avg: 0.007 ms | max: 0.211 ms | max at: 1890644.810729 s
查看Taishan服务器系统中的/proc/cmdline文件,发现其中包含了启动参数nohz = off,这表示在该系统中关闭了内核的nohz特性,这使得timer_tick切换变得更加频繁,增加了上下文切换的开销。为了解决该问题,我们在/boot/efi/EFI/euleros/grub.cfg中删除了该内核引导参数nohz = off。
3.3 应用程序调优
在搭载了鲲鹏处理器的Taishan服务器上,我们可以在编译过程中指定处理器、架构相关的编译选项来进行优化。
修改方式:
l 在Euler系统中使用HCC编译器,可以在CFLAGS和CPPFLAGS里面增加编译选项:
-mtune=tsv110 -march=armv8-a
l 在其它操作系统中,可以升级GCC版本到9.10,并在CFLAGS和CPPFLAGS里面增加编译选项:
-mtune=tsv110 -march=armv8-a
4 总结
综上,相关调优思路总结如下:
l 明确处理器和外设硬件差异,充分利用硬件特性。
l 明确操作系统差异,在不同应用场景下进行针对性的调优。
l 应用程序上需要明确架构差异,可充分利用编译选项、编程技巧进行调优。
[转帖]Nginx应用调优案例的更多相关文章
- jvm系列(六):Java服务GC参数调优案例
本文介绍了一次生产环境的JVM GC相关参数的调优过程,通过参数的调整避免了GC卡顿对JAVA服务成功率的影响. 这段时间在整理jvm系列的文章,无意中发现本文,作者思路清晰通过步步分析最终解决问题. ...
- nginx服务器调优
nginx服务器调优措施总结: 1.选择合适的网络IO模型 epoll select poll 2.配置合适的启动进程数和每个进程处理请求的工作线程数 3.启用gzip压缩以减小通信量以减少网络IO ...
- 性能调优案例分享:Mysql的cpu过高
性能调优案例分享:Mysql的cpu过高 问题:一个系统,Mysql数据库,数据量变大之后.mysql的cpu占用率很高,一个测试端访问服务器时mysql的cpu占用率为15% ,6个测试端连服务 ...
- 性能调优案例分享:jvm crash的原因 1
性能调优案例分享:jvm crash的原因 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq: ...
- Nginx性能调优
[调优]Nginx性能调优 一.Nginx优化配置 1.主配置文件优化:# vi /usr/local/nginx/conf/nginx.conf------------------------- ...
- 必读,sql加索引调优案例和explain extended说明
做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 昨天分享了Mysql中的 explain 命令,使用 explain 来分析 select 语句的运行效果,如 :expl ...
- hbase性能调优案例
hbase性能调优案例 1.人员-角色 人员有多个角色 角色优先级 角色有多个人员 人员 删除添加角色 角色 可以添加删除人员 人员 角色 删除添加 设计思路 person表 ...
- Nginx 性能调优
原文地址:http://nginx.com/blog/tuning-nginx/ Tuning NGINX for Performance Nginx 性能调优 NGINX is well known ...
- 【Nginx】Nginx服务器配置调优
1.Nginx服务器配置调优 .设置nginx全局参数 vi /usr/local/nginx/conf/nginx.conf #编辑 worker_processes ; # 工作进程数,为CPU的 ...
- OkHttpClient调优案例
OkHttpClient调优案例 作者:Grey 原文地址: 语雀 博客园 Github 实际案例 系统运行一段时间后,线程数量飙升,CPU持续居高不下 排查工具 https://fastthread ...
随机推荐
- Centos 利用本地镜像安装yum源
前提 在"设置"中确保两点 1.勾选"已连接" 2.添加上本地的"centos.iso"镜像文件 切换到用户目录 cd / 新建一个iso目 ...
- ThreadLocal真的会造成内存泄漏吗?
ThreadLoca在并发场景中,应用非常多.那ThreadLocal是不是真的会造成内存泄漏?今天给大家做一个分享,个人见解,仅供参考. 1.ThreadLocal的基本原理 简单介绍一下Threa ...
- 文心一言 VS 讯飞星火 VS chatgpt (60)-- 算法导论6.4 4题
文心一言 VS 讯飞星火 VS chatgpt (60)-- 算法导论6.4 4题 四.证明:在最坏情况下,HEAPSORT 的时间复杂度是Ω (nlgn). 文心一言: 要证明在最坏情况下,HEAP ...
- SQLite3使用笔记(2)——插入
目录 1. 论述 2. 总结 1. 论述 如同上一篇文章SQLite3使用笔记(1)--查询所述,使用SQLite进行查询操作同样有两种方式.对于比较简单的表格插入,使用sqlite3_exec()接 ...
- 又双叒叕种草了新家装风格?AI帮你家居换装
摘要:又双叒叕种草了家装新风格?想要尝试却又怕踩雷?如果能够轻松Get量身定制的家装风格图,那该多好啊.现在,这一切都成为了可能! 本文分享自华为云社区<又双叒叕种草了新家装风格?AI帮你家居换 ...
- PNG文件解读(1):PNG/APNG格式的前世今生
PNG格式的前世今生 png是一种无损压缩的位图片形格式,其设计目的是试图替代GIF和TIFF文件格式,同时增加一些GIF文件格式所不具备的特性.PNG使用从LZ77派生的无损数据压缩算法--LZW专 ...
- CentOS7与centOS8的抉择
目前国内各大云服务器的默认centos 系统版本还是7,vultr,centos只有8了 官网,下载,默认也是8,作为本地主机玩的服务器,还是试一下centos8 国外下载之前版本,下载链接: 官网默 ...
- 挖掘优质短视频超百万条,火山引擎DataLeap助力电商平台生态治理
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 在人们的日常生活中,网购已经成为人们生活中不可或缺的购物形式. 根据<中国社交电商行业发展白皮书( ...
- Mac 播放 swf Flash文件
Flash已不再支持,swf 文件彻底打不开了(一些教程),通过PD虚拟,安装 windows 操作系统在里在装了 flash 播放器使用了一段时间,始终不方便.于是找到了如下方法 首先安装:Adob ...
- python版本升级到3.8以及安装虚拟环境
linux系统升级python版本看起来复杂,如果知道其中步骤也不会觉得很困难.下面记录在deepin系统 15.11和ubuntu16.04系统下将python从2.7升级到3.8过程 升级pyth ...