基于硬件特性的性能调优
性能优化四个方向:CPU/内存&网卡&磁盘&应用
编译器性能优化:
指令布局优化:拆分函数代码,按照冷热指令重新排布,提升指令cache命中率
内存布局优化:按照内存数据访问频率,组合热数据区域,提升数据cache命中率
循环优化:分析循环迭代间数据访存依赖关系,据自动矢量化计算,加速程序运行
JDK性能优化:
JIT编译优化,GC内存回收管理优化提升内存管理性能
JVM循环、向量化、序列化技术
Nginx绑核优化举例
将Nginx进程分布到各个NUMA node之内,让系统整体的负载比较均衡,按照中断号将中断服务和Nginx绑定在一个NUMA中。性能将会非常明显的提升
NUMA指的是:非统一内存访问架构
三种NUMA绑核配置方法:
1、使用系统工具numactl设置
Numactl -C 0-15 process name
-C : Core scope
2、在代码中调用亲和性设置参数
Int sched_setaffinity(pid_t pid,size_t cpusetsize,cpu_set_t*mask)
3、多数开源软件中提供了配置接口
Nginx.conf文件中worker_cpu_affinity
基于鲲鹏压缩加速库:
Gzip
Zlib
ZSTD
Snappy
加解密加速
openssl
多媒体加速
X.256
Ffmpeg
HMPP
基础加速
Glibc
Hyperscan
加速使能
业务和基础软件库加速使能
内核态硬件加速件使能
针对性性能调优
CPU/RAM
调整内存页大小
CPU预取
修改线程调度策略
硬盘
脏数据刷新
异步文件操作
文件系统参数
网卡
网卡多队列
开启网卡TSO
开启网卡CSUM
应用
优化编译选项
文件缓存机制
缓存执行结果
NEON指令结果
针对以读为主的场景:如大数据读场景。性能约提升10%。减少IO请求数量,减轻CPU压力。
网卡中断的折中是性能调优的重点,如果没有中断会出现数据流失。本质上中断是一种电信号,通过总线把电信号发送给中断控制器。
主存和CPU之间增加高速缓冲存储器的目的是解决CPU和主存之间的速度匹配问题
硬中断:hardirq。由网卡、硬盘等外设产生,主要用来通知操作系统外设状态的变化。比如网卡收到数据包时就会发生一个中断
软中断:softirq。方便网卡做后续操作,网卡轮询软中断队列。从内存拷贝到应用套接字中。应用检测套接字中是否有新增数据。Linux将中断分为两个阶段:上半部和下半部。上半部用来处理中断;下半部用来处理上半部未完成的工作,通常以内核线程的方式运行。
就像收快递,你不确定什么时候配送到你手上,也没有办法了解配送进度。但是配送员是不等人的,到了你没取直接就走人。所以只能苦苦等着。但是你可以和配送员说好“快到了就给我打个电话”,这个电话就相当于是一个中断,只有接到电话时才会产生中断,并产生一个新动作“拿快递”。
所以中断是一种异步事件的处理机制,可以提高系统的并发处理能力。中断会打断其他进程。
可以通过网卡缓存机制(100个数据包再产生中断),但是应用层收到数据包时延也会变高。
高中断==低延迟
低中断==高吞吐
时延、吞吐、并发寻找一个均衡点
中断嵌套:Linux下的硬嵌套是可以嵌套的,但是没有优先级概念;软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。
软中断 | 硬中断 |
执行中断指令产生 | 外设引发 |
指令直接指出,无需中断控制器 | 中断控制器提供 |
不可屏蔽 | 可屏蔽 |
一种推后执行的机制 下半部 |
处理程序确保快速完成任务 上半部 |
查看软中断:
proc文件系统是一种内核空间和用户空间进行通信的机制,可以用来查看内核的数据结构,可动态修改内核的配置
查看软中断运行情况
cat /proc/softiqs
查看硬终端运行情况
cat /proc/interrupts
监控&分析&优化
监控
CPU | Top|dstat |
RAM | Numastat|free |
硬盘 | Iostat blktrace |
网卡 | Sar|ethtool |
分析
CPU | Us hi si |
RAM | Numa_hit mem |
硬盘 | Iowait util% |
网卡 | txkB/s tx-usecs |
优化
CPU | 提高并发(鲲鹏多核)、线程捆绑 |
RAM | 减少跨NUMA访问、大内存页 |
硬盘 | IO调度策略、异步IO |
网卡 | 中断聚合、网卡中断绑核 |
TOP
最常用的Linux性能检测工具之一。监视进程和整体性能。系统自带无需安装
Pref
监控进程内的调用情况、资源消耗情况并查找分析热点函数。需要手动安装
Pref top | 查看系统中的热点函数 |
Pref sched record --sleep 1 -p $PID | 记录进程在一秒内的系统调用情况 |
Pref sched latency --sort max | 查看上一次记录 |
Overhead | 表示当前事件在所有事件中占比 |
Shared Object | 当前事件生产者,如kernel、pref命令、语言库函数等 |
Symbol | 热点事件对应的函数名称。通过热点函数找到消耗资源多的行为,进行针对性优化 |
Numactl
监控当前NUMA节点配置、状态,可通过改工具将进程绑定在指定的CPU Core,由指定CPU Core运行对应进程。需要手动安装(yum install numactl numactlstat)
Numactl -H | 查看当前的NUMA配置 |
Numactl -C 0-10 ./2333 | 将应用程序'2333'绑定到0-10 Core |
Numastat | 查看当前NUMA运行状态 |
Strace:程序调试工具、监控系统调用情况
Free:系统使用和空闲资源的内存情况
sar:网口网络流量使用情况、系统调用情况、IO、RAM使用情况、进程活动情况等
EthTool:网卡状态/驱动版本信息、收发数据信息查询等配置查询
Iostat:统计磁盘IO情况、饱和度、使用率等
CacheLine对齐应用层优化可以避免内存伪共享
锁
无锁编程
大锁边小锁
高性能原子操作指令
Google Tcmalloc通过减少内存分配中的锁以提升高并发下的性能
“使用线程缓存,尺寸小于256K的小内存申请均由ThreadCache进行分配;通过TreadCache分配过程中不需要任何锁,可以极大的提高分配速度”
鲲鹏社区
鲲鹏文档:案例
鲲鹏软件:8+ OS安装包(CentOS Ubuntu等) 200+主流软件
鲲鹏论坛:问题求助、经验分享。专家值班,5分钟相应,普通问题2小时闭环
认证查询:400+鲲鹏计算兼容性认证查询和证书获取
鲲鹏小智:
兼容软件查询:快速获取鲲鹏平台以兼容的软件详细信息以及指导文档及源码下载
镜像包查询:一键获取华为镜像站、mvn仓库中已编译的Jar包及组件rpm包
汇编指令查询:快速获取常用汇编指令,从X86歉意到鲲鹏平台的替换指令,加速代码迁移
经验文档检索
代码迁移工具(Porting Advisor)
C/C++源代码文件
汇编源代码文件
Makefile文件
准确定位代码修改点以及修改指导
输入
分析扫描工具(Dependency Advisor):
软件安装包(rpm/deb/tar软件包、安装路径)
源码文件(C/C++/JAVA/汇编源代码文件、MakeFile文件)
输入
提升软件移植分析效率和准确率
性能优化工具(Tuning Kit):
CPU使用情况,DDR&Cache统计
DISK IO/NIC使用情况和质量分析
进程/线程、锁资源占用情况
Top热点函数
创建工作任务
配置任务属性参数(分析类型、软件路径、采样率等)
运行软件
输入
分析处理
图形化输出
兼容性查询:1、开源软件 2、商业软件 3、操作系统
- 点赞
- 收藏
- 关注作者
评论(0)