文章首发于我的公众号「Linux云计算网络」,欢迎关注,第一时间掌握技术干货!

这是 Linux 性能分析系列的第五篇,前四篇在这里:
一文掌握 Linux 性能分析之 CPU 篇
一文掌握 Linux 性能分析之内存篇
一文掌握 Linux 性能分析之 IO 篇
一文掌握 Linux 性能分析之网络篇

在上篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个。总结下来,余下的工具包括但不限于以下几个:

  • sar:统计信息历史
  • traceroute:测试网络路由
  • dtrace:TCP/IP 栈跟踪
  • iperf / netperf / netserver:网络性能测试工具
  • perf 性能分析神器

由于篇幅有限,本文会先介绍前面两个,其他工具留作后面介绍,大家可以持续关注。

sar

sar 是一个系统历史数据统计工具。统计的信息非常全,包括 CPU、内存、磁盘 I/O、网络、进程、系统调用等等信息,是一个集大成的工具,非常强大。在 Linux 系统上 sar --help 一下,可以看到它的完整用法。

  • -A:所有报告的总和
  • -u:输出 CPU 使用情况的统计信息
  • -v:输出 inode、文件和其他内核表的统计信息
  • -d:输出每一个块设备的活动信息
  • -r:输出内存和交换空间的统计信息
  • -b:显示 I/O和传送速率的统计信息
  • -a:文件读写情况
  • -c:输出进程统计信息,每秒创建的进程数
  • -R:输出内存页面的统计信息
  • -y:终端设备活动情况
  • -w:输出系统交换活动信息
  • -n:输出网络设备统计信息

在平时使用中,我们常常用来分析网络状况,其他几项的通常有更好的工具来分析。所以,本文会重点介绍 sar 在网络方面的分析手法。

Linux 系统用以下几个选项提供网络统计信息:

  • -n DEV:网络接口统计信息。
  • -n EDEV:网络接口错误。
  • -n IP:IP 数据报统计信息。
  • -n EIP:IP 错误统计信息。
  • -n TCP:TCP 统计信息。
  • -n ETCP:TCP 错误统计信息。
  • -n SOCK:套接字使用。

我们来看几个示例:

(1)每秒打印 TCP 的统计信息:

sar -n TCP 1

几个参数了解一下:

  • active/s:新的 TCP 主动连接(也就是 socket 中的 connect() 事件),单位是:连接数/s。
  • passive/s:新的 TCP 被动连接(也就是 socket 中的 listen() 事件)。
  • iseg/s:接收的段(传输层以段为传输单位),单位是:段/s
  • oseg/s:发送的段。
    通过这几个参数,我们基本可以知道当前系统 TCP 连接的负载情况。

(2)每秒打印感兴趣的网卡的统计信息:

sar -n DEV 1 | awk 'NR == 3 || $3 == "eth0"'

几个参数了解一下:

  • rxpck/s / txpck/s:网卡接收/发送的数据包,单位是:数据包/s。
  • rxkB/s / txkB/s:网卡接收/发送的千字节,单位是:千字节/s。
  • rxcmp/s / txcmp/s:网卡每秒接受/发送的压缩数据包,单位是:数据包/s。
  • rxmcst/s:每秒接收的多播数据包,单位是:数据包/s。
  • %ifutil:网络接口的利用率。
    这几个参数对于分析网卡接收和发送的网络吞吐量很有帮助。

(3)错误包和丢包情况分析:

sar -n EDEV 1

几个参数了解一下:

  • rxerr/s / txerr/s:每秒钟接收/发送的坏数据包
  • coll/s:每秒冲突数
  • rxdrop/s:因为缓冲充满,每秒钟丢弃的已接收数据包数
  • txdrop/s:因为缓冲充满,每秒钟丢弃的已发送数据包数
  • txcarr/s:发送数据包时,每秒载波错误数
  • rxfram/s:每秒接收数据包的帧对齐错误数
  • rxfifo/s / txfifo/s:接收/发送的数据包每秒 FIFO 过速的错误数

当发现接口传输数据包有问题时,查看以上参数能够让我们快速判断具体是出的什么问题。

OK,这个工具就介绍到这里,以上只是抛砖引玉,更多技巧还需要大家动手去探索,只有动手,才能融会贯通。

traceroute

traceroute 也是一个排查网络问题的好工具,它能显示数据包到达目标主机所经过的路径(路由器或网关的 IP 地址)。如果发现网络不通,我们可以通过这个命令来进一步判断是主机的问题还是网关的问题。

它通过向源主机和目标主机之间的设备发送一系列的探测数据包(UDP 或者 ICMP)来发现设备的存在,实现上利用了递增每一个包的 TTL 时间,来探测最终的目标主机。比如开始 TTL = 1,当到达第一个网关设备的时候,TTL - 1,当 TTL = 0 导致网关响应一个 ICMP 超时报文,这样,如果没有防火墙拦截的话,源主机就知道网关设备的地址。以此类推,逐步增加 TTL 时间,就可以探测到目标主机之间所经过的路径。

为了防止发送和响应过程出现问题导致丢包,traceroute 默认会发送 3 个探测包,我们可以用 -q x 来改变探测的数量。如果中间设备设置了防火墙限制,会导致源主机收不到响应包,就会显示 * 号。如下是 traceroute baidu 的结果:

每一行默认会显示设备名称(IP 地址)和对应的响应时间。发送多少个探测包,就显示多少个。如果只想显示 IP 地址可以用 -n 参数,这个参数可以避免 DNS 域名解析,加快响应时间。

和这个工具类似的还有一个工具叫 pathchar,但平时用的不多,我就不介绍了。
以上就是两个工具的简单介绍,工具虽然简单,但只要能解决问题,就是好工具。当然,性能分析不仅仅依靠工具就能解决的,更多需要我们多思考、多动手、多总结,逐步培养自己的系统能力,才能融会贯通。

PS:文章未经我允许,不得转载,否则后果自负。

–END–

欢迎扫👇的二维码关注我的微信公众号,后台回复「m」,可以获取往期所有技术博文推送,更多资料回复下列关键字获取。

文章首发于我的公众号「Linux云计算网络」,欢迎关注,第一时间掌握技术干货!

这是 Linux 性能分析系列的第四篇。

比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看、监控,又包括网络链路上的包转发时延、吞吐量、带宽等指标分析。包括但不限于以下分析工具:

  • ping:测试网络连通性
  • ifconfig:接口配置
  • ip:网络接口统计信息
  • netsat:多种网络栈和接口统计信息
  • ifstat:接口网络流量监控工具
  • netcat:快速构建网络连接
  • tcpdump:抓包工具
  • sar:统计信息历史
  • traceroute:测试网络路由
  • pathchar:确定网络路径特征
  • dtrace:TCP/IP 栈跟踪
  • iperf / netperf / netserver:网络性能测试工具
  • perf :性能分析神器

本文先来看前面 7 个。

ping


ping 发送 ICMP echo 数据包来探测网络的连通性,除了能直观地看出网络的连通状况外,还能获得本次连接的往返时间(RTT 时间),丢包情况,以及访问的域名所对应的 IP 地址(使用 DNS 域名解析),比如:

我们 ping baidu.com,-c参数指定发包数。可以看到,解析到了 baidu 的一台服务器 IP 地址为 220.181.112.244。RTT 时间的最小、平均、最大和算术平均差分别是 40.732ms、40.762ms、40.791ms 和 0.248。

ifconfig


ifconfig 命令被用于配置和显示 Linux 内核中网络接口的统计信息。通过这些统计信息,我们也能够进行一定的网络性能调优。

1)ifconfig 显示网络接口配置信息

其中,RX/TX packets 是对接收/发送数据包的情况统计,包括错误的包,丢掉多少包等。RX/TX bytes 是接收/发送数据字节数统计。其余还有很多参数,就不一一述说了,性能调优时可以重点关注 MTU(最大传输单元) 和 txqueuelen(发送队列长度),比如可以用下面的命令来对这两个参数进行微调:

1
2
ifconfig eth0 txqueuelen 2000
ifconfig eth0 mtu 1500

2)网络接口地址配置

ifconfig 还常用来配置网口的地址,比如:
为网卡配置和删除 IPv6 地址:

1
2
ifconfig eth0 add 33ffe:3240:800:1005::2/64    #为网卡eth0配置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/64 #为网卡eth0删除IPv6地址

修改MAC地址:

1
ifconfig eth0 hw ether 00:AA:BB:CC:dd:EE

配置IP地址:

1
2
3
ifconfig eth0 192.168.2.10
ifconfig eth0 192.168.2.10 netmask 255.255.255.0
ifconfig eth0 192.168.2.10 netmask 255.255.255.0 broadcast 192.168.2.255

IP


ip 命令用来显示或设置 Linux 主机的网络接口、路由、网络设备、策略路由和隧道等信息,是 Linux 下功能强大的网络配置工具,旨在替代 ifconfig 命令,如下显示 IP 命令的强大之处,功能涵盖到 ifconfig、netstat、route 三个命令。

netstat


netstat 可以查看整个 Linux 系统关于网络的情况,是一个集多钟网络工具于一身的组合工具。

常用的选项包括以下几个:

  • 默认:列出连接的套接字
  • -a:列出所有套接字的信息
  • -s:各种网络协议栈统计信息
  • -i:网络接口信息
  • -r:列出路由表
  • -l:仅列出有在 Listen 的服务状态
  • -p:显示 PID 和进程名称

各参数组合使用实例如下:

  • netstat -at 列出所有 TCP 端口
  • netstat -au 列出所有 UDP 端口
  • netstat -lt 列出所有监听 TCP 端口的 socket
  • netstat -lu 列出所有监听 UDP 端口的 socket
  • netstat -lx 列出所有监听 UNIX 端口的 socket
  • netstat -ap | grep ssh 找出程序运行的端口
  • netstat -an | grep ‘:80’ 找出运行在指定端口的进程

1)netstat 默认显示连接的套接字数据

整体上来看,输出结果包括两个部分:

  • Active Internet connections :有源 TCP 连接,其中 Recv-Q 和 Send-Q 指的是接收队列和发送队列,这些数字一般都是 0,如果不是,说明请求包和回包正在队列中堆积。
  • Active UNIX domain sockets:有源 UNIX 域套接口,其中 proto 显示连接使用的协议,RefCnt 表示连接到本套接口上的进程号,Types 是套接口的类型,State 是套接口当前的状态,Path 是连接到套接口的进程使用的路径名。

2)netstat -i 显示网络接口信息

接口信息包括网络接口名称(Iface)、MTU,以及一系列接收(RX-)和传输(TX-)的指标。其中 OK 表示传输成功的包,ERR 是错误包,DRP 是丢包,OVR 是超限包。

这些参数有助于我们对网络收包情况进行分析,从而判断瓶颈所在。

3)netstat -s 显示所有网络协议栈的信息

可以看到,这条命令能够显示每个协议详细的信息,这有助于我们针对协议栈进行更细粒度的分析。

4)netstat -r 显示路由表信息

这条命令能够看到主机路由表的一个情况。当然查路由我们也可以用 ip route 和 route 命令,这个命令显示的信息会更详细一些。

ifstat


ifstat 主要用来监测主机网口的网络流量,常用的选项包括:

  • -a:监测主机所有网口
  • -i:指定要监测的网口
  • -t:在每行输出信息前加上时间戳
  • -b:以 Kbit/s 显示流量数据,而不是默认的 KB/s
  • delay:采样间隔(单位是 s),即每隔 delay 的时间输出一次统计信息
  • count:采样次数,即共输出 count 次统计信息

比如,通过以下命令统计主机所有网口某一段时间内的流量数据:

可以看出,分别统计了三个网口的流量数据,前面输出的时间戳,有助于我们统计一段时间内各网口总的输入、输出流量。

netcat


netcat,简称 nc,命令简单,但功能强大,在排查网络故障时非常有用,因此它也在众多网络工具中有着“瑞士军刀”的美誉。

它主要被用来构建网络连接。可以以客户端和服务端的方式运行,当以服务端方式运行时,它负责监听某个端口并接受客户端的连接,因此可以用它来调试客户端程序;当以客户端方式运行时,它负责向服务端发起连接并收发数据,因此也可以用它来调试服务端程序,此时它有点像 Telnet 程序。

常用的选项包括以下几种:

  • -l:以服务端的方式运行,监听指定的端口。默认是以客户端的方式运行。
  • -k:重复接受并处理某个端口上的所有连接,必须与 -l 一起使用。
  • -n:使用 IP 地址表示主机,而不是主机名,使用数字表示端口号,而不是服务名称。
  • -p:当以客户端运行时,指定端口号。
  • -s:设置本地主机发出的数据包的 IP 地址。
  • -C:将 CR 和 LF 两个字符作为结束符。
  • -U:使用 UNIX 本地域套接字通信。
  • -u:使用 UDP 协议通信,默认使用的是 TCP 协议。
  • -w:如果 nc 客户端在指定的时间内未检测到任何输入,则退出。
  • -X:当 nc 客户端与代理服务器通信时,该选项指定它们之间的通信协议,目前支持的代理协议包括 “4”(SOCKS v.4),“5”(SOCKS v.5)和 “connect” (HTTPs Proxy),默认使用 SOCKS v.5。
  • -x:指定目标代理服务器的 IP 地址和端口号。

下面举一个简单的例子,使用 nc 命令发送消息:
首先,启动服务端,用 nc -l 0.0.0.0 12345 监听端口 12345 上的所有连接。

然后,启动客户端,用 nc -p 1234 127.0.0.1 12345 使用 1234 端口连接服务器 127.0.0.1::12345。

接着就可以在两端互发数据了。这里只是抛砖引玉,更多例子大家可以多实践。

tcpdump


最后是 tcpdump,强大的网络抓包工具。虽然有 wireshark 这样更易使用的图形化抓包工具,但 tcpdump 仍然是网络排错的必备利器。

tcpdump 选项很多,我就不一一列举了,大家可以看文章末尾的引用来进一步了解。这里列举几种 tcpdump 常用的用法。

1)捕获某主机的数据包

比如想要捕获主机 200.200.200.100 上所有收到和发出的所有数据包,使用:

1
tcpdump host 200.200.200.100

2)捕获多个主机的数据包

比如要捕获主机 200.200.200.1 和主机 200.200.200.2 或 200.200.200.3 的通信,使用:

1
tcpdump host 200.200.200.1 and \(200.200.200.2 or \)

同样要捕获主机 200.200.200.1 除了和主机 200.200.200.2 之外所有主机通信的 IP 包。使用:

1
tcpdump ip host 200.200.200.1 and ! 200.200.200.2

3)捕获某主机接收或发出的某种协议类型的包
比如要捕获主机 200.200.200.1 接收或发出的 Telnet 包,使用:

1
tcpdump tcp port 23 host 200.200.200.1

4)捕获某端口相关的数据包

比如捕获在端口 6666 上通过的包,使用:

1
tcpdump port 6666

5)捕获某网口的数据包
比如捕获在网口 eth0 上通过的包,使用:

1
tcpdump -i eth0

下面还是举个例子,抓取 TCP 三次握手的包:
首先,用 nc 启动一个服务端,监听端口 12345 上客户端的连接:

1
nc -v -l 0.0.0.0 12345

接着,启动 tcpdump 监听端口 12345 上通过的包:

1
tcpdump -i any 'port 12345' -XX -nn -vv -S

然后,再用 nc 启动客户端,连接服务端:

1
nc -v 127.0.0.1 12345

最后,我们看到 tcpdump 抓到包如下:

怎么分析是 TCP 的三次握手,就当做小作业留给大家吧,其实看图就已经很明显了。

总结


本文总结了几种初级的网络工具,一般的网络性能分析,通过组合以上几种工具,基本都能应付,但对于复杂的问题,以上工具可能就无能为力了。更多高阶的工具将在下文送上,敬请期待。

Reference:

  1. ip 和 ipconfig:
    https://blog.csdn.net/freeking101/article/details/68939059
  2. 性能之巅:Linux网络性能分析工具
    http://www.infoq.com/cn/articles/linux-networking-performance-analytics
  3. 抓包工具tcpdump用法说明
    https://www.cnblogs.com/f-ck-need-u/p/7064286.html

PS:文章未经我允许,不得转载,否则后果自负。

–END–

欢迎扫👇的二维码关注我的微信公众号,后台回复「m」,可以获取往期所有技术博文推送,更多资料回复下列关键字获取。

文章首发于我的公众号「Linux云计算网络」,欢迎关注,第一时间掌握技术干货!

这是 Linux 性能分析系列的第三篇。

IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存,三者读写的性能差距非常大,磁盘读写是毫秒级的(一般 0.1-10ms),内存读写是微妙级的(一般 0.1-10us),cache 是纳秒级的(一般 1-10ns)。但这也是牺牲其他特性为代价的,速度快的,价格越贵,容量也越小。

IO 性能这块,我们更多关注的是读写磁盘的性能。首先,先了解下磁盘的基本信息。

磁盘基本信息


fdisk

查看磁盘信息,包括磁盘容量,扇区大小,IO 大小等信息,常用 fdisk -l查看:

可以看到 /dev/ 下有一个 40G 的硬盘,一共 8K 多万个扇区,每个扇区 512字节,IO 大小也是 512 字节。

df

查看磁盘使用情况,通常看磁盘使用率:

磁盘性能分析


主要分析磁盘的读写效率(IOPS:每秒读写的次数;吞吐量:每秒读写的数据量),IO 繁忙程度,及 IO 访问对 CPU 的消耗等性能指标。

vmstat

第一个较为常用的还是这个万能的 vmstat:

对于 IO,我们常关注三个部分:

  • b 值:表示因为 IO 阻塞排队的任务数
  • bi 和 bo 值:表示每秒读写磁盘的块数,bi(block in)是写磁盘,bo(block out)是读磁盘。
  • wa 值:表示因为 IO 等待(wait)而消耗的 CPU 比例。

一般这几个值偏大,都意味着系统 IO 的消耗较大,对于读请求较大的服务器,b、bo、wa 的值偏大,而写请求较大的服务器,b、bi、wa 的值偏大。

iostat

vmstat 虽然万能,但是它分析的东西有限,iostat 是专业分析 IO 性能的工具,可以方便查看 CPU、网卡、tty 设备、磁盘、CD-ROM 等等设备的信息,非常强大,总结下来,共有以下几种用法:

1)iostat -c 查看部分 CPU 使用情况:

这里显示的是多个 CPU 的平均值,每个字段的含义我就不多解释了,我一般会重点关注 %iowait 和 %idle,分别表示 CPU 等待 IO 完成时间的百分比和 CPU 空闲时间百分比。

如果 %iowait 较高,则表明磁盘存在 IO 瓶颈,如果 %idle 较高,则 CPU 比较空闲,如果两个值都比较高,则有可能 CPU 在等待分配内存,瓶颈在内存,此时应该加大内存,如果 %idle 较低,则此时瓶颈在 CPU,应该增加 CPU 资源。

2)iostat -d 查看磁盘使用情况,主要是显示 IOPS 和吞吐量信息(-k : 以 KB 为单位显示,-m:以 M 为单位显示):

其中,几个参数分别解释如下:

  • tps:设备每秒的传输次数(transfers per second),也就是读写次数。
  • kB_read/s 和 kB_wrtn/s:每秒读写磁盘的数据量。
  • kB_read 和 kB_wrtn:读取磁盘的数据总量。

3)iostat -x 查看磁盘详细信息:

其中,几个参数解释如下;

  • rrqm/s 和 wrqm/s:分别每秒进行合并的读操作数和写操作数,这是什么意思呢,合并就是说把多次 IO 请求合并成少量的几次,这样可以减小 IO 开销,buffer 存在的意义就是为了解决这个问题的。
  • r/s 和 w/s:每秒磁盘读写的次数。这两个值相加就是 tps。
  • rkB/s 和 wkB/s:每秒磁盘读写的数据量,这两个值和上面的 kB_read/s、kB_wrnt/s 是一样的。
  • avgrq-sz:平均每次读写磁盘扇区的大小。
  • avgqu-sze:平均 IO 队列长度。队列长度越短越好。
  • await:平均每次磁盘读写的等待时间(ms)。
  • svctm:平均每次磁盘读写的服务时间(ms)。
  • %util:一秒钟有百分之多少的时间用于磁盘读写操作。

以上这些参数太多了,我们并不需要每个都关注,可以重点关注两个:

a. %util:衡量 IO 的繁忙程度

这个值越大,说明产生的 IO 请求较多,IO 压力较大,我们可以结合 %idle 参数来看,如果 %idle < 70% 就说明 IO 比较繁忙了。也可以结合 vmstat 的 b 参数(等待 IO 的进程数)和 wa 参数(IO 等待所占 CPU 时间百分比)来看,如果 wa > 30% 也说明 IO 较为繁忙。

b. await:衡量 IO 的响应速度

通俗理解,await 就像我们去医院看病排队等待的时间,这个值和医生的服务速度(svctm)和你前面排队的人数(avgqu-size)有关。如果 svctm 和 await 接近,说明磁盘 IO 响应时间较快,排队较少,如果 await 远大于 svctm,说明此时队列太长,响应较慢,这时可以考虑换性能更好的磁盘或升级 CPU。

4)iostat 1 2 默认显示 cpu 和 吞吐量信息,1 定时 1s 显示,2 显示 2 条信息

进程 IO 性能分析


有了以上两个命令,基本上能对磁盘 IO 的信息有个全方位的了解了。但如果要确定具体哪个进程的 IO 开销较大,这就得借助另外的工具了。

iotop

这个命令类似 top,可以显示每个进程的 IO 情况,有了这个命令,就可以定位具体哪个进程的 IO 开销比较大了。

总结


OK,最后还是总结下,fdisk -l 和 df 查看磁盘基本信息,iostat -d 查看磁盘 IOPS 和吞吐量,iostat -x 结合 vmstat 查看磁盘的繁忙程度和处理效率。

下文我们将探讨网络方面的的性能分析问题。

Reference:
1.linux 性能分析:
http://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/iostat.html

  1. linux 性能分析工具总结:
    http://rdc.hundsun.com/portal/article/731.html

PS:文章未经我允许,不得转载,否则后果自负。

–END–

欢迎扫👇的二维码关注我的微信公众号,后台回复「m」,可以获取往期所有技术博文推送,更多资料回复下列关键字获取。

文章首发于我的公众号「Linux云计算网络」,欢迎关注,第一时间掌握技术干货!

内存信息


同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法。

/proc/meminfo

这个文件记录着比较详细的内存配置信息,使用 cat /proc/meminfo 查看。

我们比较关心的是下面几个字段:

  • MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 2G,但其实只有 1.95G 可用。
  • MemFree:系统空闲内存。
  • MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
  • Buffers:缓冲区内存
  • Cached:缓存

上面信息没有 MemUsed 的值,虽然可以用现有的值大致估算出来,但是我们想一步到位,就用下面的 free 命令。

free

这个命令估计用的人就多了(我一般都是用这个命令)。

这里存在一个计算公式:

MemTotal = used + free + buff/cache(单位 K)

几个字段和上面 /proc/meminfo 的字段是对应的。还有个 shared 字段,这个是多进程的共享内存空间,不常用。

我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。

要看比较直观的值,可以加 -h 参数:

dmidecode

同样可以使用这个命令,对于内存,可以使用 dmidecode -t memory 查看:

vmstat

这个命令也是非常常用了。但对于内存,显示信息有限。它更多是用于进行系统全局分析和 CPU 分析。详细可以看 CPU 分析一文。

进程内存使用情况分析


最常用的两个命令 ps 和 top,虽然很简单的两个命令,但还是有不少学问的。

top/htop

top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认即可。

可以看到,我按照 “%MEM” 排序的结果。这个结果对于查看系统占用内存较多的哪些进程是比较有用的。

然后这里我们会重点关注几个地方,上面横排区,和前面几个命令一样可以查看系统内存信息,中间标注的横条部分,和内存相关的有三个字段:VIRT、RES、SHR。

  • VIRT:virtual memory usage,进程占用的虚拟内存大小。
  • RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
  • SHR:shared memory,共享内存大小,不常用。

ps

ps 同样可以查看进程占用内存情况,一般常用来查看 Top n 进程占用内存情况,如:

ps aux --sort=rss | head -n,表示按 rss 排序,取 Top n。

这里也关注三个字段:

  • %MEM:进程使用物理内存所占百分比。
  • VSZ:进程使用虚拟内存大小。
  • RSS:进程使用物理内存大小,我们会重点关注这个值。

pmap

这个命令用于查看进程的内存映像信息,能够查看进程在哪些地方用了多少内存。常用 pmap -x pid 来查看。


可以看到该进程内存被哪些库、哪些文件所占用,据此我们定位程序对内存的使用。

几个字段介绍一下:

  • Address:占用内存的文件的内存起始地址。
  • Kbytes:占用内存的字节数。
  • RSS:实际占用内存大小。
  • Dirty:脏页大小。
  • Mapping:占用内存的文件,[anon] 为已分配的内存,[stack] 为程序堆栈
  • 最后的 total 为统计的总值。我们可以使用 pmap -x pid | tail -1 这样只显示最后一行,循环显示最后一行,达到监控该进程的目的。使用:
    while true; do pmap -x pid | tail -1; sleep 1; done

OK,以上工具都是 Linux 自带的,当然还有很多高阶的工具,比如 atop、memstat 等等,对于内存泄漏有一个比较常用的检测工具 Valgrind,这些等之后再找时间跟大家分享了。

通过以上手段,我们基本上就能定位内存问题所在了,究竟是内存太小,还是进程占用内存太多,有哪些进程占用较多,这些进程又究竟有哪些地方占用较多,这些问题通过以上方法都能解决。

最后简单总结下,以上不少工具可能有人会犯选择困难症了。对于我来说,查看系统内存用 free -h,分析进程内存占用用 ps 或者 top(首选 ps),深入分析选择 pmap,就酱。

Reference:
1.Linux下查看内存使用情况的多种方法:
http://stor.51cto.com/art/201804/570236.htm

PS:文章未经我允许,不得转载,否则后果自负。

–END–

欢迎扫👇的二维码关注我的微信公众号,后台回复「m」,可以获取往期所有技术博文推送,更多资料回复下列关键字获取。

文章首发于我的公众号「Linux云计算网络」,欢迎关注,第一时间掌握技术干货!

平常工作会涉及到一些 Linux 性能分析的问题,因此决定总结一下常用的一些性能分析手段,仅供参考。

说到性能分析,基本上就是 CPU、内存、磁盘 IO 以及网络这几个部分,本文先来看 CPU 这个部分。

1 CPU 基础信息


进行性能分析之前,首先得知道 CPU 有哪些信息,可以通过以下方法查看 CPU 配置信息。

lscpu

在 Linux 下,类似 lsxxx 这样的命令都是用来查看基本信息的,如 ls 查看当前目录文件信息,lscpu 就用来查看 CPU 信息,类似还有 lspci 查看 PCI 信息。

可以看到我的机器配置很低,1 核 2.5GHz(在阿里云买的最低配的服务器)。

/proc/cpuinfo

/proc 目录是内核透传出来给用户态使用的,里面记录着很多信息文件,比如还有内存文件 meminfo 等。可以使用 cat /proc/cpuinfo 查看 CPU 信息。

这里显示的信息可以具体到每个逻辑核上,由于我只有一个核,所以只显示一组信息。

dmidecode

这个命令是用来获取 DMI(Desktop Management Interface)硬件信息的,包括 BIOS、系统、主板、处理器、内存、缓存等等。对于 CPU 信息,可以使用 dmidecode -t processor 来查看。

2 CPU 使用情况分析


知道了 CPU 的基本信息,我们就可以使用另外的命令来对 CPU 的使用情况分析一通了。

top

相信大家对下面这玩意不陌生,Windows 的任务管理器,top 的作用和它是一样的。

top 显示的效果虽说不像它这么华丽,但已然让人惊呼他俩怎么长得这么像。

我们重点关注这么几个字段:

  • load average:三个数字分别表示最近 1 分钟,5 分钟和 15 分钟的负责,数值越大负载越重。一般要求不超过核数,比如对于单核情况要 < 1。如果机器长期处于高于核数的情况,说明机器 CPU 消耗严重了。
  • %Cpu(s):表示当前 CPU 的使用情况,如果要查看所有核(逻辑核)的使用情况,可以按下数字 “1” 查看。这里有几个参数,表示如下:
1
2
3
4
5
6
7
8
- us    用户空间占用 CPU 时间比例
- sy 系统占用 CPU 时间比例
- ni 用户空间改变过优先级的进程占用 CPU 时间比例
- id CPU 空闲时间比
- wa IO等待时间比(IO等待高时,可能是磁盘性能有问题了)
- hi 硬件中断
- si 软件中断
- st steal time

每个进程的使用情况:这里可以罗列每个进程的使用情况,包括内存和 CPU 的,如果要看某个具体的进程,可以使用 top -p pid 查看。

和 top 一样的还有一个改进版的工具:htop,功能和 top 一样的,只不过比 top 表现更炫酷,使用更方便,可以看下它的效果。

ps

可能很多人会忽略这个命令,觉得这不是查看进程状态信息的吗,其实非也,这个命令配合它的参数能显示很多功能。比如 ps aux。如果配合 watch,可以达到跟 top 一样的效果,如:watch -n 1 "ps aux"(-n 1 表示每隔 1s 更新一次)

vmstat

这个命令基本能看出当前机器的运行状态和问题,非常强大。可以使用 vmstat n 后面跟一个数字,表示每隔 ns 显示系统的状态,信息包括 CPU、内存和 IO 等。

几个关键的字段:

  • r 值:表示在 CPU 运行队列中等待的进程数,如果这个值很大,表示很多进程在排队等待执行,CPU 压力山大。
  • in 和 cs 值:表示中断次数和上下文切换次数,这两个值越大,表示系统在进行大量的进程(或线程)切换。切换的开销是非常大的,这时候应该减少系统进程(或线程)数。
  • us、sy、id、wa 值:这些值上面也提到过,分别表示用户空间进程,系统进程,空闲和 IO 等待的 CPU 占比,这里只有 id 很高是好的,表示系统比较闲,其他值飚高都不好。

这个工具强大之处在于它不仅可以分析 CPU,还可以分析内存、IO 等信息,犹如瑞士军刀。

dstat

这个命令也很强大,能显示 CPU 使用情况,磁盘 IO 情况,网络发包情况和换页情况,而且输出是彩色的,可读性比较强,相对于 vmstat 更加详细和直观。使用时可以直接输入命令,也可以带相关参数。

3 进程使用 CPU 情况分析


上面说的是系统级的分析,现在来看单个进程的 CPU 使用情况分析,以便于我们能对占用 CPU 过多的进程进行调试和分析,优化程序性能。

其实前面 top 和 ps 这样的命令就可以看每个进程的 CPU 使用情况,但我们需要更专业的命令。

pidstat

这个命令默认统计系统信息,也包括 CPU、内存和 IO 等,我们常用 pidstat -u -p pid [times] 来显示 CPU 统计信息。如下统计 pid = 802 的 CPU 信息。

strace

这个命令用来分析进程的系统调用情况,可以看进程都调用了哪些库和哪些系统调用,进而可以进一步优化程序。比如我们分析 ls 的系统调用情况,就可以用 strace ls:

可以看到,一个简单的 ls 命令,其实有不少系统调用的操作。

此外,还可以 attach(附着)到一个正在运行的进程上进行分析,比如我 attach 到 802 这个进程显示:

根据这些输出信息,其实就能够很好地帮我们分析问题,从而定位到问题所在了。

OK,以上就是平常比较常用的一些工具,当然除了这些,还有很多很多工具,下面放一张图,来自 Linux 大牛,Netflix 高级性能架构师 Brendan Gregg。看完了,你也许会感叹“这世界太疯狂了(just crazy)”。

Reference:
[1]. http://rdc.hundsun.com/portal/article/731.html

PS:文章未经我允许,不得转载,否则后果自负。

–END–

欢迎扫👇的二维码关注我的微信公众号,后台回复「m」,可以获取往期所有技术博文推送,更多资料回复下列关键字获取。