基础设施优化
CPU 优化
多级缓存
充分利用 cache 是 CPU 调优的重要手段,由于是底层优化作用范围广。
性能分析利器——Perf 参数学习
提升 cache 命中率
缓存命中: CPU 要取的数据再一级缓存内,直接读取,称为 cache 命中率
使用 Perf 查看 Data[i][j] 和 Data[j][i] 性能对比。
对于一个二维数组,是先遍历后排序还是先排序后遍历性能更好。
提升多核 cache 命中率
若发生 CPU 切换,则之前 L1 和 L2 cache 会发生切换(L1 和 L2 每个CPU单独拥有, L3 多个 CPU 公用),优化会失效。
绑定到 CPU 比不绑定 CPU 性能更加。
小结:
数据 cache 命中率提升
命令 cache 命中率提升
CPU 绑定
内存优化
应用程序分配内存过程
业务代码-->应用层内存池-->C 库内存池--> 操作系统内存分配
linux 默认 C 库内存池 Ptmalloc2
cat /proc/${PID}/maps 查看内存分配
堆内存最小分配132k
堆内存最好尽早释放
Tcmalloc C 库内存池适合小内存分配,中大内存分配不如 Ptmalloc2
界限:0-256k 小 256k-1M 中 1M 以上 大
Tcmalloc: 多线程、256k 以下
Ptmalloc2: 通用性好,大内存
堆和栈内存
栈速度快,缺点:容量和声明周期
磁盘优化
磁盘常常是瓶颈所在
优化技术
零拷贝(缓存 IO 技术)
网卡支持 SG-DMA 还可以更快。
缺陷:大文件传输 PageCache 技术的缺陷。
直接 IO + 异步 IO
大文件传输可以使用此方法。
系统网络优化
TCP 握手优化
SYN 请求优化
服务端优化
SYN 半队列溢出
netstat -s 可以查看由队列满引起的连接失败次数
设置 syncookie ,可以在队列满后继续建立连接, 参数含义如下:
0:关闭
1:队列满开启
2:无条件开启
accept 队列溢出
linux 默认丢弃新连接,设置 tcp_abort_on_overflow 参数,可以发送 RST 给客户端。 参数含义如下:
0:丢弃
1:发 RST 给客户端
绕过三次握手发送数据
Goole 统计,三次握手在 http 请求时间中占了 10% ~ 30%。
TFO 实现过程:
正常三次握手
SYN 携带数据
设置系统参数 tcp_fastopen 来使用 TFO, 需要客户端和服务器同时支持。
TCP 挥手优化
Close 函数
Shutdown 函数
tcp_orphan_retries: 控制主动方重传 FIN 的次数,默认值为 0,表示 8 次
FIN_WAIT_1
tcp_max_orphans
tcp_fin_timeout
被动方参数优化
netstat 发现大量 close_wait