性能指标
API接口:每次调用耗时 或 QPS
网络服务端: Throughput (吞吐,即QPS)+ Latency (调用延迟)
性能测量的方法
- 性能分析工具:如c++下有perf/gprof,go下有pprof
使用这类工具可以帮你发现性能瓶颈 - 时间测量:通过使用时间测量方式来看程序执行发了多少时间
Linux下常用的有clock_gettime, gettimeofday等命令,获取起止时间后相减即可,亦可将其包装为一个timer类,然后插入程序代码段中来测量
常见的性能优化方法
性能优化本质上是减少CPU执行的指令数,代码实现中常用的一些方法如下:
字符串处理: 预留空间,使用append操作拼接和右值拷贝避免临时字符串,减少char*与string的转换等
零拷贝:使用指针或引用、右值操作,写时复制COW,减少对象的copy
内存映射内存管理:内存池与对象池、缓存,高性能内存管理库(如TCMalloc)
无锁化:双buffer,原子操作,thread local变量
算法优化:使用更好的算法,算法调优;数据结构调优,如c++不需要排序场景中的kv操作可以使用unordered_map替换map;使用增量替换全量
网络调用方面:序列化方法(如使用更加紧凑的序列化方式,如pb替代json),数据压缩,使用连接池/线程池(网络IO),使用writev减少系统调用次数
使用异步编程方式提高并发:异步调用/协程调用,异步调用如c++的promise/future,std::async,协程调用如go语言的go routine,c++业界常用的一些协程库如微信的libco,百度的brpc bthread;使用reactor方式(如epoll)实现网络调用全异步
性能优化相关的命令
下面列一些常用的命令,具体使用方式可自行Google或查看命令的man手册
-
top
查看每个进程的cpu使用率, top -H -p PID,在top命令显示页面上进一步按1,可以看到某个具体cpu的使用率情况 -
perf
查看CPU在哪个函数上耗时高:perf top -K -p PID
扫描系统在各个函数上的耗时,用于生成火焰图:perf record -e cpu-clock -g -p PID -
iftop
用于查看网卡带宽的使用情况,如查看网卡1:iftop -i eth0
性能测试中可能由于网卡打满,造成QPS上不去,这时就需要使用此命令来确认 -
iostat
用于输出CPU和磁盘输入输出、分区、网络文件系统NFS相关的统计信息 -
time
可以列出命令的用户态和内核态的执行时长
相关书籍
由于本人主要使用c++语言,这边推荐下的有《c++性能优化指南》、《Effective C++》、 《MoreEffective C++》、 《EffectiveSTL》、《C++Concurrency in action(C++并发编程实战)》