Linux 下基础设施及系统网络优化

基础设施优化

CPU 优化

  1. 多级缓存
    充分利用 cache 是 CPU 调优的重要手段,由于是底层优化作用范围广。

  2. 性能分析利器——Perf 参数学习

  3. 提升 cache 命中率
    缓存命中: CPU 要取的数据再一级缓存内,直接读取,称为 cache 命中率

  • 使用 Perf 查看 Data[i][j] 和 Data[j][i] 性能对比。

  • 对于一个二维数组,是先遍历后排序还是先排序后遍历性能更好。

  1. 提升多核 cache 命中率
    若发生 CPU 切换,则之前 L1 和 L2 cache 会发生切换(L1 和 L2 每个CPU单独拥有, L3 多个 CPU 公用),优化会失效。
    绑定到 CPU 比不绑定 CPU 性能更加。

小结:

  • 数据 cache 命中率提升
  • 命令 cache 命中率提升
  • CPU 绑定

内存优化

  1. 应用程序分配内存过程

业务代码-->应用层内存池-->C 库内存池--> 操作系统内存分配

  1. linux 默认 C 库内存池 Ptmalloc2

cat /proc/${PID}/maps 查看内存分配

堆内存最小分配132k
堆内存最好尽早释放

Tcmalloc C 库内存池适合小内存分配,中大内存分配不如 Ptmalloc2
界限:0-256k 小 256k-1M 中 1M 以上 大

Tcmalloc: 多线程、256k 以下
Ptmalloc2: 通用性好,大内存

  1. 堆和栈内存
    栈速度快,缺点:容量和声明周期

磁盘优化

磁盘常常是瓶颈所在

  1. 优化技术
  • 零拷贝(缓存 IO 技术)
    网卡支持 SG-DMA 还可以更快。
    缺陷:大文件传输 PageCache 技术的缺陷。

  • 直接 IO + 异步 IO
    大文件传输可以使用此方法。

系统网络优化

TCP 握手优化

  1. SYN 请求优化

  2. 服务端优化

  • SYN 半队列溢出
    netstat -s 可以查看由队列满引起的连接失败次数
    设置 syncookie ,可以在队列满后继续建立连接, 参数含义如下:

0:关闭
1:队列满开启
2:无条件开启

  • accept 队列溢出
    linux 默认丢弃新连接,设置 tcp_abort_on_overflow 参数,可以发送 RST 给客户端。 参数含义如下:

0:丢弃
1:发 RST 给客户端

  1. 绕过三次握手发送数据
    Goole 统计,三次握手在 http 请求时间中占了 10% ~ 30%。
    TFO 实现过程:
  1. 正常三次握手
  2. SYN 携带数据

设置系统参数 tcp_fastopen 来使用 TFO, 需要客户端和服务器同时支持。

TCP 挥手优化

  1. Close 函数
    Shutdown 函数

  2. tcp_orphan_retries: 控制主动方重传 FIN 的次数,默认值为 0,表示 8 次
    FIN_WAIT_1
    tcp_max_orphans
    tcp_fin_timeout

  3. 被动方参数优化
    netstat 发现大量 close_wait

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。