linux-tools

Table of Contents

1 Overview

linux-analysis-and-tools.jpg

2 CPU

2.1 mpstat

[zhangyan@tc-cm-et18.tc.baidu.com]$ mpstat -P ALL 1
Linux 2.6.9_5-10-0-1 (tc-cm-et18.tc.baidu.com)  2011年09月20日

08时39分58秒  CPU   %user   %nice %system %iowait    %irq   %soft   %idle    intr/s
08时39分59秒  all   37.55    0.00    0.00    0.00    0.00    0.00   62.45   1009.00
08时39分59秒    0    0.00    0.00    0.00    0.00    0.00    0.00  100.00   1002.00
08时39分59秒    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
08时39分59秒    2    0.00    0.00    0.00    0.00    0.00    0.00  100.00      7.00
08时39分59秒    3  100.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
08时39分59秒    4  100.00    0.00    0.00    0.00    0.00    0.00    0.00      0.00
08时39分59秒    5    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
08时39分59秒    6    0.00    0.00    0.00    0.00    0.00    0.00   99.00      0.00
08时39分59秒    7    0.00    0.00    0.00    0.00    0.00    0.00  100.00      0.00
  • CPU 处理器编号
  • %user 处理user状态占用率
  • %nice 处理user状态并且是nice priority占用率
  • %system 处理system状态占用率(不包括硬中断和软中断)
  • %iowait 在进行io操作时候有cpu idle时间比率
  • %irq CPU耗费在硬中断上时间比率
  • %soft CPU耗费在软中断上时间比率(软中断可以被任何一个CPU处理)
  • %idle 在没有io操作时候的cpu idle时间比率
  • intr/s 每秒CPU中断次数(包括硬中断和软终端)

2.2 taskset

设置和获取进程的CPU亲和性. 对应的系统调用是sched_set(get)affinity/sched_getaffinity

  • taskset -c 1,2,3 cmd # 程序只能运行在CPU #1,#2,#3上
  • taskset -cp 1,2,3 pid # 进程只能运行在CPU #1,#2,#3上
  • taskset -c mask cmd|pid # 通过mask格式进行设置,比如0x3就是#0和#1亲和性
  • taskset -p <pid> # 进程<pid>亲和性

2.3 ps(process snapshot)

  • ps -ef f # 进程树结构
  • ps -eo user,sz,rss,minflt,majflt,pcpu,args # 指定字段

进程状态有下面几种:

  • D uninterruptible sleep (usually IO)
  • R running or runnable (on run queue)
  • S interruptible sleep (waiting for an event to complete)
  • T stopped, either by a job control signal or because it is being traced.
  • W paging (not valid since the 2.6.xx kernel)
  • X dead (should never be seen)
  • Z defunct ("zombie") process, terminated but not reaped by its parent.
  • < high-priority (not nice to other users)
  • N low-priority (nice to other users)
  • L has pages locked into memory (for real-time and custom IO)
  • s is a session leader
  • l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
  • + is in the foreground process group.

3 VM

3.1 vmstat

  • vmstat 1 # 虚拟内存使用情况
  • vmstat -s # 虚拟内存相关的系统事件次数统计
[dirlt@localhost.localdomain]$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      4  45752  33460  99324    0    0     1     1    1    9  0  0 99  0  0
 0  0      4  45752  33460  99324    0    0     0     0    1    8  0  0 100  0  0
  • r 多少个进程正在等待运行
  • b 多少个进程block住了
  • swpd 虚拟内存(swap)
  • free 空闲内存(phy)
  • buff 缓冲内存(用于read/write等操作)(phy)
  • cache 缓冲内存(用于文件系统以及内存系统管理)(phy)
  • 前面三个参数相加才是可用内存大小
  • si 读取disk使用的虚拟内存
  • so 写disk使用的虚拟内存
  • bi[block in] 块设备读取速率,blocks/s
  • bo[block out] 块设备写速度,blocks/s
  • in[interrupt] 每秒中断个数
  • cs[context switch] 每秒上下文切换次数
  • us 用户态时间[user]
  • sy 系统时间[system]
  • id 空闲时间[idle]
  • wa 等待io时间[wait IO]
  • st 虚拟机使用时间[stolen from VM]
[zhangyan04@tc-hpc-dev.tc.baidu.com]$ vmstat -s
      8191996  total memory
      4519256  used memory
      1760044  active memory
      2327204  inactive memory
      3672740  free memory
        76200  buffer memory
      3935788  swap cache
      1020088  total swap
            0  used swap
      1020088  free swap
       423476 non-nice user cpu ticks
           91 nice user cpu ticks
       295803 system cpu ticks
     70621941 idle cpu ticks
        39354 IO-wait cpu ticks
          800 IRQ cpu ticks
        52009 softirq cpu ticks
       317179 pages paged in
     54413375 pages paged out
            0 pages swapped in
            0 pages swapped out
    754373489 interrupts
    500998741 CPU context switches
   1323083318 boot time
       418742 forks

3.2 free

[zhangyan04@tc-hpc-dev.tc.baidu.com]$ free -t
             total       used       free     shared    buffers     cached
Mem:       8191996    4519868    3672128          0      76204    3935864
-/+ buffers/cache:     507800    7684196
Swap:      1020088          0    1020088
Total:     9212084    4519868    4692216
  • total 总内存大小[实际内存大小]
  • used 已经使用大小[buffers+shared+cached+应用程序使用]
  • free 未使用大小
  • shared 共享内存大小
  • buffers 用于read/write等操作
  • cached 用于文件系统以及内存系统
  • - buffers/cache 表示used-buffers/cached的大小,就是应用程序已经使用内存大小
  • + buffers/cache 表示free+buffers/cached的大小,就是所有可供应用程序使用的大小
  • Swap:total 交换分区大小
  • Swap:used 交换分区使用大小
  • Swap:free 可以使用的分区大小

关于buffers和cached区别, see Linux Kernel Development Chapter16 页高速缓存和页回写

3.3 vmtouch

https://github.com/hoytech/vmtouch 用来warmup数据

  • mlock/munlock 将进程部分内存lock住而不会切换到swap分区上面
  • mlockall/munlockall 将进程所有内存都lock住而不会切换到swap分区上面
  • posix_fadvise 告诉系统对文件数据访问模式(有助于系统进行IO优化)

4 DiskIO

4.1 iostat

dirlt@dirlt-virtual-machine:~$ iostat -dx 1
Linux 3.2.0-23-generic (dirlt-virtual-machine)  2012年06月18日  _x86_64_        (1 CPU)

xsDevice:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.02     0.00     8.00     0.00   29.00   29.00    0.00  29.00   0.01
sda               6.34     5.72   15.95   12.60   192.62  5675.85   411.10     2.48   87.41   18.33  174.88   2.74   7.83

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
scd0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00    0.00    0.00   0.00   0.00
  • Device 设备名
  • tps number of transfers per second.对于IO device多个请求可能会合并成为一个transfer.不过似乎没有太大意义。
  • Blk_read/s(kB_read/s, MB_read/s). 读速度,这里Block相当于一个扇区占据512bytes.
  • Blk_wrtn/s(kB_wrtn/s, MB_wrtn/s). 写速度。
  • Blk_read(kb_read, MB_read). 读总量
  • Blk_wrtn(kB_wrtn, MB_wrtn). 写总量
  • rrqm/s 每秒多少个读请求被merge.当系统调用需要读取数据的时候,VFS将请求发到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,FS会将这个请求合并Merge
  • wrqm/s 每秒多少个些请求被merge
  • r/s 每秒多少个读请求(after merged)
  • w/s 每秒多少个写请求(after merged)
  • rsec/s(rkB/s, rMB/s) 读速度。sec表示sector.
  • wsec/s(wkB/s, wMB/s) 写速度
  • avgrq-sz 提交到这个device queue上面请求的平均大小(in sectors)
  • avgqu-sz 提交到这个device queue上面请求的平均长度
  • await 提交到这个device上面请求处理的平均时间(ms)
  • r_await 提交到这个device上面读请求处理的平均时间
  • w_await 提交到这个device上面写请求处理的平均时间
  • svctm #todo: not used any more
  • %util CPU在处理IO请求时的百分比.可以认为是IO设备使用率.

4.2 iotop

`iotop -ao [-P]`

  • o 只展现有IO活动的任务
  • a 将iotop启动以来IO数值累加
  • P 以process而非thread为单位

5 NetworkIO

5.1 ifconfig

  • ifconfig <eth-x> <ip> # 创建网卡绑定IP
  • ifconfig <eth-x> down # 关闭网卡
  • ifconfig <eth-x> up # 开启网卡
  • ifconfig <eth-x> # 网卡信息

`/sbin/ifconfig -a` 网卡配置和统计数据

[zhangyan04@tc-hpc-dev.tc.baidu.com]$ /sbin/ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:1D:09:22:C9:A9
          BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          Interrupt:16 Memory:f4000000-f4012800

eth1      Link encap:Ethernet  HWaddr 00:1D:09:22:C9:A7
          inet addr:10.26.140.39  Bcast:10.26.140.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:90671796 errors:0 dropped:14456 overruns:0 frame:0
          TX packets:143541932 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:71169282564 (66.2 GiB)  TX bytes:74096812979 (69.0 GiB)
          Interrupt:16 Memory:f8000000-f8012800

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:231762640 errors:0 dropped:0 overruns:0 frame:0
          TX packets:231762640 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:98089257363 (91.3 GiB)  TX bytes:98089257363 (91.3 GiB)
  • encap # 网卡连接网络类型. Ethernet(以太网), Local Loopback(本地环路)
  • HWaddr # 网卡物理地址(MAC)
  • inet_addr # 绑定IP地址
  • Bcast # IP的广播地址
  • Mask # 子网掩码
  • UP(打开) BROADCAST(广播) MULTICAST(多播) RUNNING(运行)
  • MTU # (Maximum Transport Unit)最大传输单元,以太网1500字节
  • Metric ?
  • RX packets # 接受packets数目
  • TX packets # 传输packets数目
  • errors # 错误packets数目
  • dropped # 丢弃packets数目
  • overruns frame carrier ?
  • collisions ?
  • txqueuelen # 发送packets的queue长度上限
  • RX bytes # 接收字节
  • TX bytes # 发送字节

5.2 netstat

  • netstat -s [–tcp|–udp|–raw] # 各种协议统计数据
  • netstat -ntp # 本机所有TCP链接
  • netstat -nltp # 本机所有处于监听状态的TCP连接
  • netstat -i # 网卡流量统计信息
  • netstat -r # 路由规则

5.3 ss(socket statistics)

`ss -s` 系统所有socket使用情况汇总

➜  notes git:(master) ✗ ss -s
Total: 1071 (kernel 0)
TCP:   63 (estab 23, closed 1, orphaned 0, synrecv 0, timewait 1/0), ports 0

Transport Total     IP        IPv6
*	  0         -         -
RAW	  1         1         0
UDP	  29        23        6
TCP	  62        56        6
INET	  92        80        12
FRAG	  0         0         0

5.4 tc(traffic control)

tc - show / manipulate traffic control settings.

netem (network emulation) http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

  • tc qdisc [add|change] dev [DEV] root netem [specification] # 在设备上创建和修改规则
  • tc qdisc del dev [DEV] root # 删除设备上定义规则
  • tc qdisc show dev [DEV] # 查看设备上定义的规则

specification

  • delay 100ms 10ms 25%. 延迟分布在[100-10,100+10]. next_delay = random(90,110) * 0.75 + last_delay * 0.25
  • delay 100ms 10ms distribution normal 延迟正态分布[100-10,100+10]
  • loss 1% #丢包概率1%
  • loss 1% 25% #丢包概率在random(1%) * 0.75 + last_loss * 0.25
  • duplicate 1% #重复概率1%
  • corrupt 1% #坏包概率1%

5.5 iftop

http://www.ex-parrot.com/~pdw/iftop/

`iftop -nNPB` see conf

  • TX / RX # 传输接收
  • cum # cumulativ 累积值
  • peak # 最近40s的传输峰值
  • rates # 最近2, 10, 40s的传输平均值
  • 白色部分是传输速率可视化表示

iftop-illustration.png

5.6 iperf

https://iperf.fr/ 测量网络吞吐

5.7 mtr

my traceroute. ping和traceroute两个工具的合体. 两种工作方式, 一种是实时查看, 一种是生成报表. 两者区别是实时查看的话mtr会不断地发送ICMP, 而报表模式则需要指定发送多少个ICMP.

root@iZ62cqwtc33Z:~/podcast-crawler# sudo mtr d3s7zw2sg6cujw.cloudfront.net -r -w -c 10
Start: Wed Aug 10 16:39:08 2016
HOST: iZ62cqwtc33Z                                 Loss%   Snt   Last   Avg  Best  Wrst StDev
  1.|-- 11.246.154.118                                0.0%    10    0.7   0.8   0.7   1.0   0.0
  2.|-- 11.246.154.118                                0.0%    10    0.9   0.8   0.7   0.9   0.0
  3.|-- 116.251.66.166                                0.0%    10    1.0   0.9   0.8   1.0   0.0
  4.|-- 63-216-176-73.static.pccwglobal.net           0.0%    10    1.1   1.4   1.1   2.9   0.3
  5.|-- TenGE3-8.br01.tok02.pccwbtn.net               0.0%    10   52.6  72.8  52.5 218.5  52.4
  6.|-- TenGE3-8.br01.tok02.pccwbtn.net               0.0%    10   52.2  79.0  52.2 218.6  58.3
  7.|-- 63-218-251-54.static.pccwglobal.net           0.0%    10   52.2  52.3  52.1  53.1   0.0
  8.|-- 52.95.30.177                                  0.0%    10   62.0  66.7  61.3  71.3   3.8
  9.|-- 52.95.30.32                                   0.0%    10   60.1  60.5  59.9  61.1   0.0
 10.|-- 27.0.0.115                                    0.0%    10   61.7  62.0  61.3  66.5   1.5
 11.|-- ???                                          100.0    10    0.0   0.0   0.0   0.0   0.0
 12.|-- ???                                          100.0    10    0.0   0.0   0.0   0.0   0.0
 13.|-- ???                                          100.0    10    0.0   0.0   0.0   0.0   0.0
 14.|-- server-54-192-233-135.nrt12.r.cloudfront.net 10.0%    10   86.7  86.9  86.7  87.3   0.0

这里想测试一下从主机到cloudfront.net的速度如何. 一共发送了100个packets, 可以看到共有14跳. 最后一跳的丢包率大约在10%, ping的平均值在86.9ms.

6 System

6.1 strace

`strace -C -ttt -T -r [-p pid | args]`

  • C # 运行结束打印汇总
  • ttt # 打印syscall绝对时间戳
  • r # 打印syscall相对时间戳
  • T # syscall耗时

6.2 sysprof

http://sysprof.com/ a statistical, system-wide profiler for Linux.

6.3 sar

`sar -n DEV 1` 网卡流量

  • IFACE network interface
  • rxpck/s rcv packets/s
  • txpck/s snd packets/s
  • rxbyt/s rcv bytes/s
  • txbyt/s snd bytes/s

linux-tools-sar.png

6.4 pidstat

`pidstat [-d | -r | -s | -u | -v | -w] [-p pid] 1`

  • p # 观察特定进程, 否则只观察活跃进程
  • d # 磁盘IO状况
  • r # 内存使用
  • s # 堆栈情况
  • u # CPU使用
  • v # 内核资源
  • w # 上下文切换

6.6 collectl

linux-tools-collectl.png

7 Admin

7.1 rsync

  • `rsync -avrz dir user@host:/dir/` # 注意目录后面需要加上/
  • `rsync -avrz /dir/file1 user@host:/dir/file

7.2 lsof

  • lsof -nP | grep "delete" # 已被删除但是依然被某些进程打开的文件
  • lsof /home # 哪些进程打开了/home文件(目录)

7.3 uptime

➜  notes git:(master) ✗ uptime
 13:50:11 up 3 days, 17:12,  4 users,  load average: 0.27, 0.29, 0.27
  • The current time,
  • how long the system has been running,
  • how many users are currently logged on,
  • and the system load aver‐ages for the past 1, 5, and 15 minutes.

7.4 crontab

`crontab -e` 编辑crontab配置文件

任务分为6个字段: minute hour day month week command

  • minute范围是0-59
  • hour范围是0-23
  • day范围是1-31
  • month范围是1-12
  • week范围是0-7[0/7表示Sun]

对于每个字段可以有几种表示

  • - 表示匹配所有时间
  • num 表示完全匹配
  • num1-num2 表示匹配范围
  • num1,num2,num3… 进行枚举匹配
  • num1-num2/interval 表示从num1-num2时间段内每interval间隔

配置文件参考

0 6 * * * /home/dirlt/platform/apache/bin/apachectl restart 每天早上6点重启apache
0,30 18-23 * * * /home/dirlt/platform/apache/bin/apachectl restart 每天18-23时候每隔半小时重启apache
\* 23-7/1 * * * /* 23-7/1 * * * /usr/local/apache/bin/apachectl restart 每天从23到次日7点每隔一小时重启apache

7.5 ntp

http://www.ntp.org/

ntp(network time protocol)是用来做机器时间同步的,包含下面几个组件:

  • ntpd(ntp daemon) 后台进程可以用来从其他机器上面同步时间,也可以为其他机器提供时间同步。配置文件是/etc/ntpd.conf.
  • ntpq(ntp query) 查询当前时间同步的情况。
  • ntpdate(ntp date) 和其他机器进行同步,不可以和ntpd共同使用。
[dirlt@umeng-ubuntu-pc] > sudo /etc/init.d/ntp start
 * Starting NTP server ntpd
   ...done.
[dirlt@umeng-ubuntu-pc] > sudo /usr/sbin/ntpdate cn.pool.ntp.org
12 Nov 17:08:07 ntpdate[30044]: the NTP socket is in use, exiting
[dirlt@umeng-ubuntu-pc] > sudo /etc/init.d/ntp stop
 * Stopping NTP server ntpd
   ...done.
[dirlt@umeng-ubuntu-pc] > sudo /usr/sbin/ntpdate cn.pool.ntp.org
12 Nov 17:08:22 ntpdate[30061]: adjust time server 202.112.31.197 offset -0.071953 sec
[dirlt@umeng-ubuntu-pc] > ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 netmon2.dcs1.bi 121.182.147.191  2 u    7   64    1  405.743   10.731   0.000
 202-150-213-154 133.243.238.163  2 u    8   64    1  171.722  -131.73   0.000
 dns1.synet.edu. 223.255.185.2    2 u    7   64    1  166.558  -39.375   0.000
 Hshh.org        66.220.9.122     2 u    6   64    1   41.734  -109.29   0.000
 europium.canoni 193.79.237.14    2 u    4   64    1  673.181  -240.24   0.000

一个重要的问题是,daemon以什么时间间隔来和指定的server进行同步以及如何调整差异. (How does it work?) ntp是可以在minpoll和maxpoll指定的时间间隔内来选择同步间隔的,默认使用minpoll也就是64seconds.

7.6 iptables

`iptables -S` 列举所有规则

➜  ~GALERA_SRC git:(yan) sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
  • INPUT ACCEPT 所有输入都接受
  • FORWARD ACCEPT 所有转发接受
  • OUTPUT ACCEPT 所有输出接受

`/sbin/iptables -I INPUT -p tcp –dport 80 -j ACCEPT` 打开80端口

`iptables -A [chain] [chain-specification]` 添加规则

sudo iptables -A INPUT -s "192.168.100.104" -d "192.168.100.105" -j DROP

其中chain指INPUT, 之后部分都是chain-specification. 其中s表示过滤源地址,d表示目的地址,而-j而表示动作。(在输入上, 如果src/dst和上面匹配的话, 数据包被丢弃)

`iptables -D` 删除规则。规则既可以使用rule-num来引用,也可以使用chain-specification来指定

➜  ~GALERA_SRC git:(yan) sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -s 192.168.100.104/32 -d 192.168.100.105/32 -j DROP
-A INPUT -s 192.168.100.105/32 -d 192.168.100.104/32 -j DROP
➜  ~GALERA_SRC git:(yan) sudo iptables -D INPUT 1
➜  ~GALERA_SRC git:(yan) sudo iptables -D INPUT -s 192.168.100.105/32 -d 192.168.100.104/32 -j DROP
➜  ~GALERA_SRC git:(yan) sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

7.7 ab

ab(apache benchmarking)

`ab -c 100 -n 10000 -r localhost/` 共10k个请求, 并发数100. 结果`Requsts per second`显示QPS在13k/s

Server Software:        nginx/1.2.1
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        1439 bytes

Concurrency Level:      100
Time taken for tests:   0.760 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      16500000 bytes
HTML transferred:       14390000 bytes
Requests per second:    13150.09 [#/sec] (mean)
Time per request:       7.605 [ms] (mean)
Time per request:       0.076 [ms] (mean, across all concurrent requests)
Transfer rate:          21189.11 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.4      0      18
Processing:     2    7   1.8      7      20
Waiting:        1    7   1.8      7      20
Total:          5    7   2.0      7      20

Percentage of the requests served within a certain time (ms)
  50%      7
  66%      7
  75%      8
  80%      8
  90%      9
  95%     10
  98%     14
  99%     19
 100%     20 (longest request)
comments powered by Disqus