性能调优学习
性能调优攻略
-
测试:两个关键指标:吞吐量,延迟
-
测试之后,定位性能瓶颈
查看操作系统负载
看看操作系统的CPU利用率,看看内存使用率,看看操作系统的IO,还有网络的IO,网络链接数,等等
比如linux系统:top命令
- 如果cpu利用率不高,但是两个关键指标上不去了,说明可能IO耗时较大,就看一下IO大不大(磁盘文件IO,驱动程序IO,内存换页率)
- 然后查看网络带宽情况,可以使用tcpdump查看
- 如果上面所说的都没问题,说明是程序问题(锁,资源获取等待,切换上下文等等)
一般的非程序问题都可以通过配置硬件或操作系统的配置来解决(带宽,内存,tcp缓冲区)
使用profiler测试(性能检测工具)
可查看程序中各个模块函数和指令的运行时间,调用次数,cpu利用率
重点观察那些运行时间最长,调用次数最多的函数和指令,对于调用次数很多但是耗时很短的函数,如果缩短10ns的时间,性能提升也会非常大
常见的系统瓶颈
- 空间换时间:缓存
- 时间换空间:网络传输时所用的压缩算法,虽然耗时,但是此时的系统瓶颈在于网络io,用时间换空间反倒节省时间
- 简化代码
二八原则,20%的代码消耗了80%的性能,优化那20%的代码
算法调优
- 过滤算法
- hash算法
- 分治法,预处理
代码调优
- 字符串操作
- 多线程调优
- 内存分配
- 异步操作
- 语言和代码库
网络调优
- TCP调优
会产生开销:占用文件描述符和缓存
会有很多timewait链接在HTTP服务器上,下面是相关的两个参数:前者表示重用timewait,后者表示回收
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
- UDP调优
MTU----最大传输单元,要设置达到带宽资源的充分利用
UDP最大的一个好处是多播,对于在内网中通知多台节点时非常方便和高效
- 网卡调优
把Buffer调大对于需要大数据量的网络传输非常有效。
系统调优
- IO模型
- 多核CPU调优:cpu0是很关键的,它被用的过狠的话别的cpu性能也会下降,所以我们可以手动为程序分配cpu核
- NUMA技术:传统的多核运算是使用SMP(Symmetric Multi-Processor对称多处理器)模式,多个处理器共享一个存储器和IO总线,就会出现数据一致性问题。但是NUMA模式下,处理器被划分成多个node, 每个node有自己的本地存储器空间。
- 文件系统调优
数据库调优
摘选自酷壳 RSS:https://coolshell.cn/feed