软件优化网站,wordpress手机轻主题,国内交互网站,wordpress 后台精简环境准备
预先安装 docker、perf、hping3、curl 等工具#xff0c;如 apt install docker.io linux-tools-common hping3
操作和分析
Linux 在启动过程中#xff0c;有三个特殊的进程#xff0c;也就是 PID 号最小的三个进程。 0 号进程为 idle 进程#xff0c;这也是系…环境准备
预先安装 docker、perf、hping3、curl 等工具如 apt install docker.io linux-tools-common hping3
操作和分析
Linux 在启动过程中有三个特殊的进程也就是 PID 号最小的三个进程。 0 号进程为 idle 进程这也是系统创建的第一个进程它在初始化 1 号和 2 号进程后演变为空闲任务。当 CPU 上没有其他任务执行时就会运行它。 1 号进程为 init 进程通常是 systemd 进程在用户态运行用来管理其他用户态进程。 2 号进程为 kthreadd 进程在内核态运行用来管理内核线程。 要查找内核线程我们只需要从 2 号进程开始查找它的子孙进程即可。比如你可以使用 ps 命令来查找 kthreadd 的子进程
ps -f --ppid 2 -p 2
UID PID PPID C STIME TTY TIME CMD
root 2 0 0 1月04 ? 00:00:00 [kthreadd]
root 4 2 0 1月04 ? 00:00:00 [kworker/0:0H]
root 6 2 0 1月04 ? 00:00:40 [ksoftirqd/0]
root 7 2 0 1月04 ? 00:00:20 [migration/0]
root 8 2 0 1月04 ? 00:00:00 [rcu_bh]
root 9 2 0 1月04 ? 00:02:36 [rcu_sched]
root 10 2 0 1月04 ? 00:00:00 [lru-add-drain]
root 11 2 0 1月04 ? 00:00:00 [watchdog/0]
root 12 2 0 1月04 ? 00:00:00 [watchdog/1]
很多常见的内核线程我们在性能分析中都经常会碰到比如下面这几个内核线程。 kswapd0用于内存回收。在 Swap 变高 案例中我曾介绍过它的工作原理。 kworker用于执行内核工作队列分为绑定 CPU 名称格式为 kworker/CPU:ID和未绑定 CPU名称格式为 kworker/uPOOL:ID两类。 migration在负载均衡过程中把进程迁移到 CPU 上。每个 CPU 都有一个 migration 内核线程。 jbd2/sda1-8jbd 是 Journaling Block Device 的缩写用来为文件系统提供日志功能以保证数据的完整性名称中的 sda1-8表示磁盘分区名称和设备号。每个使用了 ext4 文件系统的磁盘分区都会有一个 jbd2 内核线程。 pdflush用于将内存中的脏页被修改过但还未写入磁盘的文件页写入磁盘已经在 3.10 中合并入了 kworker 中。 案例用到两台虚拟机 在第一个终端执行下面的命令运行案例也就是一个最基本的 Nginx 应用
# 运行Nginx服务并对外开放80端口
docker run -itd --namenginx -p 80:80 nginx在第二个终端使用 curl 访问 Nginx 监听的端口确认 Nginx 正常启动。假设 192.168.0.30 是 Nginx 所在虚拟机的 IP 地址运行 curl 命令后你应该会看到下面这个输出界面
curl http://xxx.xxx.xxx.xxx/还是在第二个终端中运行 hping3 命令模拟 Nginx 的客户端请求
hping3 -S -p 80 -i u1 xxx.xxx.xxx.xxx执行top命令 CPU 的软中断使用率都超过了 30%而 CPU 使用率最高的进程正好是软中断内核线程 ksoftirqd/0 和 ksoftirqd/1。 已经知道了 ksoftirqd 的基本功能可以猜测是因为大量网络收发引起了 CPU 使用率升高但它到底在执行什么逻辑我们却并不知道。 那还有没有其他方法来观察内核线程 ksoftirqd 的行为呢 perf 可以对指定的进程或者事件进行采样并且还可以用调用栈的形式输出整个调用链上的汇总信息。 我们不妨就用 perf 来试着分析一下进程号为 6 的 ksoftirqd。
$ perf record -a -g -p 9 -- sleep 30执行 perf report命令你就可以得到 perf 的汇总报告。按上下方向键以及回车键展开比例最高的 ksoftirqd net_rx_action 和 netif_receive_skb表明这是接收网络包rx 表示 receive。 br_handle_frame 表明网络包经过了网桥br 表示 bridge。br_nf_pre_routing 表明在网桥上执行了 netfilter 的 PREROUTINGnf 表示 netfilter。而我们已经知道 PREROUTING 主要用来执行 DNAT所以可以猜测这里有 DNAT 发生。br_pass_frame_up表明网桥处理后再交给桥接的其他桥接网卡进一步处理。比如在新的网卡上接收网络包、执行 netfilter 过滤规则等等。 用火焰图来查看层级太多的调用栈 假设刚才用 perf record 生成的文件路径为 /root/perf.data执行下面的命令你就可以直接生成火焰图
perf script -i /root/perf.data | ./stackcollapse-perf.pl --all | ./flamegraph.pl ksoftirqd.svg我们就找出了内核线程 ksoftirqd 执行最频繁的函数调用堆栈而这个堆栈中的各层级函数就是潜在的性能瓶颈来源。这样后面想要进一步分析、优化时也就有了根据。