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应用调优案例相关推荐

  1. 【华为云技术分享】三大前端技术(React,Vue,Angular)探密(下)

    [华为云技术分享]三大前端技术(React,Vue,Angular)探密(上) [Angular] Angular(通常被称为 "Angular 2+"或 "Angula ...

  2. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 3

    4. 微观层面 4.1 个体动机 在开源软件发展之初, 商业组织的投入很少甚至没有, 完全是靠Richard Stallman 或者 linus Torvalds 这样的个人在努力推动开源软件艰难前行 ...

  3. 【华为云技术分享】“技术-经济范式”视角下的开源软件演进剖析-part 1

    前言 以互联网为代表的信息技术的迅猛发展对整个经济体系产生了巨大的影响.信息技术的发展一方面使知识的积累和传播更加迅速,知识爆炸性的增长:另一方面,使信息的获取变得越来越容易,信息交流的强度逐渐增加, ...

  4. 【华为云技术分享】直播回顾丨激发数据裂变新动能,HDC.Cloud云数据库前沿技术解读

    3月24日14:00-17:00,HDC.Cloud开发者沙龙系列云数据库专场直播线上开启,此次华为云数据库通过三场直播从NoSQL数据库新技术.数据库迁移.行业解决方案等方面对云端数据库进行深度解读 ...

  5. 【华为云技术分享】[HDC.Cloud]基于鲲鹏平台的Ceph深度性能调优

    随着IOT.大数据.移动互联等应用的暴涨,产生的数据也越来越多,整个存储市场总量也逐年增长,预计到2021年分布式存储会占到整个存储市场的50%,到2027年,分布式存储会占到整个市场的70%.Cep ...

  6. 【华为云技术分享】鲲鹏开发套件:让应用软件迁移调优So Easy

    鲲鹏开发套件是提供给开发者面向鲲鹏处理器进行应用软件迁移与调优的系列化工具.通过鲲鹏开发套件可实现对海量代码进行快速扫描和分析,并提供专业的代码移植指导,以及移植后全面的系统性能分析与可视化呈现,从而 ...

  7. 【华为云技术分享】云图说 | 初识云耀云服务器,打造“极优、极简”的云上体验

    描述:华为云HECS(Hyper Elastic Cloud Server,云耀云服务器)是专为中小企业和个人开发者打造的新一代云服务器,助力企业上云更轻松! 华为云HECS(Hyper Elasti ...

  8. 【华为云技术分享】AI 开发路漫漫,什么才是真正的极客精神?

    摘要:AI开发看上去很美,实践起来却不是一件容易的事.一个聪明的开发者知道借助工具提升开发效率,一个智能的平台则会站在开发者的立场,为用户提供贴心服务. "理想很丰满,现实很骨感." ...

  9. 【华为云技术分享】【资料下载合集】HDC.Cloud华为开发者大会2020

    [摘要] 小伙伴们今天有观看直播吧!看到各种灵魂弹幕涌现,当然也有爱学习的小伙伴问线上资料从哪下载呢?热心小编汇总线上各大演讲材料分享给大家,欢迎下载! 温馨提醒:下载资料请提前登录华为云账号 类别 ...

最新文章

  1. 计算机c盘属性不显示安全选项,win7系统中文件夹属性安全选项卡空白的解决方法...
  2. Maven 命令格式及一些常用命令
  3. JS遍历对象或者数组
  4. Spring、SpringMVC和SpringBoot之间的关系
  5. 更新一波,微信第三方开发平台授权流程
  6. 不占内存的浏览器_4款黑科技办公网站,高效实用,不占内存,高手的必备神器...
  7. 能不能在FOR循环中执行SQL?
  8. 设计模式--观察者模式与命令模式
  9. OpenJDK8已经将近3个月没修改了
  10. 做科普自媒体是怎么挣钱的?
  11. 5个AIDA64激活密钥
  12. 漂亮的聊天软件网页HTML5模板源码下载
  13. 仰望星空,脚踏实地——吴燕生
  14. Vivado 2020.1 and 2020.2 错误 arm-none-eabi-ar: *.o: Invalid argument
  15. unet预测图片全黑/全灰解决方案(keras)
  16. lisp倒入excel数据画图_如何将EXCEL中的数据导入CAD2007画图
  17. JavaScript、Lua语言基础、电脑脚本、手机免ROOT免越狱脚本开发免费视频教程
  18. 实验室-关于老铁整一个社会语录api与网抑云热评api(并引入百度语音tts)
  19. Tkinter 组件详解(十八):PanedWindow
  20. 杀毒软件 clamav 的安装和使用

热门文章

  1. Python笔记(4) 关键字
  2. ajax多选下拉,模拟select下拉框之多选(数据源采用模拟Ajax数据--原创)(示例代码)...
  3. Chrome OS 70 发布:这是安卓的私生子吗?
  4. 前端写分页(用了自己同事写的插件)
  5. matlab中如何在图片上添加横竖线
  6. ASP.net 省市级联(用户控件)适用用framework3.5以上版本
  7. Variant类型转换成CString代码
  8. 佳能发售曝光对应的「IXY DIGITAL 3000 IS」
  9. 毕业一周年,工作一周年零七天
  10. java安卓图片全屏_在Android中全屏显示GIF图片(演示代码)