https://time.geekbang.org/column/intro/140 http://www.brendangregg.com/ https://github.com/iovisor/bcc http 压测工具: https://github.com/wg/wrk 火焰图: http://www.brendangregg.com/flamegraphs.html

实战

CPU 使用率高->函数

  1. # -g开启调用关系分析,-p指定php-fpm的进程号21515
  2. $ perf top -g -p 21515

找出高CPU应用

  1. # 记录性能事件,等待大约15秒后按 Ctrl+C 退出
  2. $ perf record -g
  3. # 查看报告
  4. $ perf report

进程树

  1. # -a 表示输出命令行选项
  2. # p表PID
  3. # s表示指定进程的父进程
  4. $ pstree -aps 3084
  5. systemd,1
  6. └─dockerd,15006 -H fd://
  7. └─docker-containe,15024 --config /var/run/docker/containerd/containerd.toml
  8. └─docker-containe,3991 -namespace moby -workdir...
  9. └─app,4009
  10. └─(app,3084)

OOM

  1. # 重新执行 memleak工具检查内存泄漏情况$ /usr/share/bcc/tools/memleak -a -p $(pidof app)
  2. Attaching to pid 18808, Ctrl+C to quit.
  3. [10:23:18] Top 10 stacks with outstanding allocations:
  4. [10:23:23] Top 10 stacks with outstanding allocations:

swap

  1. # 命令可以直接将进程按照swap使用量排序显示
  2. smem --sort swap

狂打日志的内鬼

  1. # -d 查看 i/o 使用情况
  2. pidstat -d 1
  3. # 观察系统调用情况
  4. strace -p 12280 2>&1 | grep write # 如果 write 日志过多
  5. $ strace -p 18940
  6. strace: Process 18940 attached
  7. ...
  8. mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f7aee9000
  9. mmap(NULL, 314576896, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f0f682e8000
  10. write(3, "2018-12-05 15:23:01,709 - __main"..., 314572844
  11. ) = 314572844
  12. munmap(0x7f0f682e8000, 314576896) = 0
  13. write(3, "\n", 1) = 1
  14. munmap(0x7f0f7aee9000, 314576896) = 0
  15. close(3) = 0
  16. stat("/tmp/logtest.txt.1", {st_mode=S_IFREG|0644, st_size=943718535, ...}) = 0

IOwait 高

优化 -> 使用内存, 减少磁盘IO

查看 socket 信息

  1. # head -n 3 表示只显示前面3行
  2. # -l 表示只显示监听套接字
  3. # -n 表示显示数字地址和端口(而不是名字)
  4. # -p 表示显示进程信息
  5. $ netstat -nlp | head -n 3
  6. Active Internet connections (only servers)
  7. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  8. tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 840/systemd-resolve
  9. # -l 表示只显示监听套接字
  10. # -t 表示只显示 TCP 套接字
  11. # -n 表示显示数字地址和端口(而不是名字)
  12. # -p 表示显示进程信息
  13. $ ss -ltnp | head -n 3
  14. State Recv-Q Send-Q Local Address:Port Peer Address:Port
  15. LISTEN 0 128 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=840,fd=13))
  16. LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1459,fd=3))

DNS 不稳定

  1. ping -c3 114.114.114.114

网络流量分析: tcpdump + Wireshark

网络延迟增大

  1. # 80端口正常
  2. $ curl http://192.168.0.30:80
  3. # 测试80端口延迟
  4. $ hping3 -c 3 -S -p 80 192.168.0.30
  5. # 测试80端口性能
  6. $ wrk --latency -c 100 -t 2 --timeout 2 http://192.168.0.30/

NAT 性能优化

CPU

1e66612e0022cd6c17847f3ab6989007.png
7a445960a4bc0a58a02e1bc75648aa17.png596397e1d6335d2990f70427ad4b14ec.pngb0c67a7196f5ca4cc58f14f959a364ca.png

内存

e28cf90f0b137574bca170984d1e6736.png
8f477035fc4348a1f80bde3117a7dfed.png52bb55fba133401889206d02c224769b.png
d79cd017f0c90b84a36e70a3c5dccffe.png

磁盘IO

6f26fa18a73458764fcda00212006698.png14bc3d26efe093d3eada173f869146b1.png328d942a38230a973f11bae67307be47.png728b7b39252a1e23a7a223cdf4aa1612.png1802a35475ee2755fb45aec55ed2d98a.pngb6d67150e471e1340a6f3c3dc3ba0120.pngc48b6664c6d334695ed881d5047446e9.pngcff31e715af51c9cb8085ce1bb48318d.png

网络IO

0d87b39b89a1b7f325fc5477c0182ea0.png3af644b6d463869ece19786a4634f765.png5f2d4957663dd8bf3410da8180ab18f0.pnga1eb07e281e5795be83c11d7255c543b.pngb07ea76a8737ed93395736795ede44e0.pngc7b5b16539f90caabb537362ee7c27ac.pngc072bb9c9dfd727ed187bc24beb3e3d1.png

Linux 性能工具图谱

9ee6c1c5d88b0468af1a3280865a6b7a.png

linux 性能优化

0faf56cd9521e665f739b03dd04470ba.png

linux 知识地图

679d37172d194b5018487f9eab582c03.jpg