※,Linux性能分析:https://www.cnblogs.com/bakari/p/10515977.html
★,之CPU篇:
cpu个数、核数、线程数是cpu的三个重要概念。一般个人PC上只有一个物理cpu,服务器上可以有多个物理cpu。一个物理cpu可以有多个核(比如4核,8核等等);一个物理核可以使用超线程技术超出多个虚拟核(即线程),一般是一个物理核对应2个线程,比如4核8线程等等,但也有1个核对应更多线程的,比如IBM的power7处理器是8核32线程。
服务器67.27cpu情况: Intel(R) Xeon(R) Silver 4210R CPU @ 2.40GHz; 2颗物理cpu,每颗cpu是10核20线程,总共是2*20个线程。
- ·lscpu· // 在 Linux 下,类似 lsxxx 这样的命令都是用来查看基本信息的,如 ls 查看当前目录文件信息,lscpu 就用来查看 CPU 信息,类似还有 lspci 查看 PCI 信息,lsmem查看内存信息。
- ·cat /proc/cpuinfo· // /proc 目录是内核透传出来给用户态使用的,里面记录着很多信息文件,比如还有内存文件 meminfo 等。可以使用 cat /proc/cpuinfo 查看 CPU 信息。
- 获取cpu型号,以及总线程数
- `cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c`
- 查看 CPU 物理个数: ·grep 'physical id' /proc/cpuinfo | sort -u | wc -l·
- 查看 CPU 核心数量: ·grep 'core id' /proc/cpuinfo | sort -u | wc -l·(这里查到的是一颗物理cpu的核心数)
- 查看 CPU 线程数: ·grep 'processor' /proc/cpuinfo | sort -u | wc -l·(这里查到的是所有物理cpu总的线程数,单颗cpu的线程数需要除以物理cpu的个数)
- 查看 CPU 型号: ·dmidecode -s processor-version· // 可以通过输出的行数得出此机器有多少物理cpu个数。
- 查看 CPU 的详细信息:·cat /proc/cpuinfo·
- 获取cpu型号,以及总线程数
- ·dmidecode· // 这个命令是用来获取 DMI(Desktop Management Interface)硬件信息的,包括 BIOS、系统、主板、处理器、内存、缓存等等。
- `dmidecode -t processor` //查看CPU信息
- `top` //参看之前笔记.
- 之后按1可以展开所有核数
- ·ps· // 参看之前笔记。
- ·vmstat· // 这个命令基本能看出当前机器的运行状态和问题,非常强大。可以使用 ·vmstat n· 后面跟一个数字,表示每隔 ns 显示系统的状态,信息包括 CPU、内存和 IO 等。几个关键的字段:
- r 值:表示在 CPU 运行队列中等待的进程数,如果这个值很大,表示很多进程在排队等待执行,CPU 压力山大。
- in 和 cs 值:表示中断次数和上下文切换次数,这两个值越大,表示系统在进行大量的进程(或线程)切换。切换的开销是非常大的,这时候应该减少系统进程(或线程)数。
- us、sy、id、wa 值:这些值上面也提到过,分别表示用户空间进程,系统进程,空闲和 IO 等待的 CPU 占比,这里只有 id 很高是好的,表示系统比较闲,其他值飚高都不好。
- `dstat` //这个命令也很强大,能显示 CPU 使用情况,磁盘 IO 情况,网络发包情况和换页情况,而且输出是彩色的,可读性比较强,相对于 vmstat 更加详细和直观。使用时可以直接输入命令,也可以带相关参数。
上面说的是系统级的分析,现在来看单个进程的 CPU 使用情况分析,以便于我们能对占用 CPU 过多的进程进行调试和分析,优化程序性能。
- `pidstat` // 这个命令默认统计系统信息,也包括 CPU、内存和 IO 等,我们常用 pidstat -u -p pid [times] 来显示 CPU 统计信息。如下统计 pid = 802 的 CPU 信息
- `pidstat -u -p 802 1`
- `strace` // 这个命令用来分析进程的系统调用情况,可以看进程都调用了哪些库和哪些系统调用,进而可以进一步优化程序。比如我们分析 ls 的系统调用情况,就可以用 strace ls.
- `strace -p 802` // attach(附着)到一个正在运行的进程上进行分析,比如我 attach 到 802 这个进程显示.
- `perf` // 进阶工具
- ·systemtap· //高级工具
- ·kprobe· // 撸码工具
★,之内存篇:
- ·cat /proc/meminfo· // 我们比较关心的是下面几个字段:
- MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 2G,但其实只有 1.95G 可用。
- MemFree:系统空闲内存。
- MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
- Buffers:缓冲区内存
- Cached:缓存
- `free` //几个字段和上面 /proc/meminfo 的字段是对应的。还有个 shared 字段,这个是多进程的共享内存空间,不常用。
- `free -h` //要看比较直观的值,可以加 -h 参数
- MemTotal = used + free + buff/cache(单位 K)
- 从应用程序的角度讲,Linux实际可用内存=free + buffer/cache。或者直接看available,两个值稍微有些差别。
- 我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。
- ·dmidecode· // 同CPU分析
- `dmidecode -t memory` // 查看内存
- `vmstat` // 这个命令也是非常常用了。但对于内存,显示信息有限。它更多是用于进行系统全局分析和 CPU 分析。
进程内存使用情况分析:
- ·top / htop· // 参见另一篇笔记
- ·ps· //参见另一篇笔记
- ·pmap· // ·pmap -x pid· 这个命令用于查看进程的内存映像信息,可以看到该进程内存被哪些库、哪些文件所占用,据此我们定位程序对内存的使用。几个字段介绍一下:
- Address:占用内存的文件的内存起始地址。
- Kbytes:占用内存的字节数。
- RSS:实际占用内存大小。(Resident Set Size)。
- Dirty:脏页大小。
- Mapping:占用内存的文件,[anon] 为已分配的内存,[stack] 为程序堆栈
- 最后的 total 为统计的总值。我们可以使用 pmap -x pid | tail -1 这样只显示最后一行,循环显示最后一行,达到监控该进程的目的。使用`while true; do pmap -x pid | tail -1; sleep 1; done`
高阶工具:
- ·atop·
- `memstat`
- `Valgrind` // 对于内存泄漏有一个比较常用的检测工具
★,之IO篇:IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存,三者读写的性能差距非常大,磁盘读写是毫秒级的(一般 0.1-10ms),内存读写是微妙级的(一般 0.1-10us),cache 是纳秒级的(一般 1-10ns)。但这也是牺牲其他特性为代价的,速度快的,价格越贵,容量也越小。IO 性能这块,我们更多关注的是读写磁盘的性能。
磁盘基本信息:
- ·fdisk -l· // 小写L。查看所有已挂载和未挂载的磁盘信息,包括磁盘容量,扇区大小,IO 大小等信息,但不显示文件系统类型。
- Linux系统的分区格式使用的是xyzN的格式,xy表示的是硬盘类型,比如sd表示是SCSI硬盘,z表示的是硬盘序号,第一块硬盘是a,第二块硬盘是b, 要查询Linux系统上有几块硬盘,只要注意这一点即可;N表示的是分区号。
- 类似 /dev/mapper/centos-root 这样的磁盘其实是逻辑卷,不是物理磁盘。
- fdisk命令会显示磁盘的字节大小(精确大小),显示的GB单位是按照1GB=1000MB计算的。
- ·df -h· // 只可以查看已经挂载的磁盘使用情况。查看磁盘使用情况,通常看磁盘使用率。这里显示的G是以1024为进制的!!!
- ·df -T· // -T查看磁盘分区文件系统类型。
-
[root@BJ01-KY-TOOL01 iflyer]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 80G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 79G 0 part └─centos-root 253:0 0 79G 0 lvm / sdb 8:16 0 700G 0 disk /data1 sr0 11:0 1 1024M 0 rom [root@BJ01-KY-TOOL01 iflyer]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 79G 3.5G 76G 5% / devtmpfs 32G 0 32G 0% /dev tmpfs 32G 0 32G 0% /dev/shm tmpfs 32G 3.3G 29G 11% /run tmpfs 32G 0 32G 0% /sys/fs/cgroup /dev/sdb 689G 358G 297G 55% /data1 /dev/sda1 1014M 143M 872M 15% /boot tmpfs 6.3G 0 6.3G 0% /run/user/1000 172.22.145.122:/data1/SongBank 27T 21T 6.4T 77% /data1/SongBank tmpfs 6.3G 0 6.3G 0% /run/user/0 ############关于devtmpfs和tmpfs########### tmpfs是建立在内存的虚拟文件系统,默认情况下最大占用内存一半大小的空间 devtmpfs:http://www.mybatis.cn/archives/1639.html
- ·lsblk· // 可以清晰的查看出主机上有几块磁盘(包括挂载的和未挂载的)。这里显示的单位都是计算机标准单位,即按照1GB=1024MB计算的。
- ·lsblk -f· // 显示文件系统类型.
- ·blkid· // blkid主要用来对系统的块设备(包括交换分区)所使用的文件系统类型、LABEL、UUID等信息进行查询
- ·parted -l· // 可以查看未挂载的文件系统类型,以及哪些分区尚未格式化.
- ·file [OPTION...] [FILE...]· // Determine type of FILEs. file命令可以查看文件的类型。
- ·file -s /dev/sda3· // file命令的-s参数可以treat special (block/char devices) files as ordinary ones。可以查看磁盘的分区文件系统类型。
- 判断磁盘是机械硬盘还是固态硬盘
- ·cat /sys/block/sdb/queue/rotational· // 0代表固态盘,1代表机械盘
- ·lsblk -d -o name,rota· // 参数 -d 表示显示设备名称,参数 -o 表示仅显示特定的列。 rota值为1代表机械盘,0代表固态盘。
磁盘性能分析:主要分析磁盘的读写效率(IOPS:每秒读写的次数;吞吐量:每秒读写的数据量),IO 繁忙程度,及 IO 访问对 CPU 的消耗等性能指标。
- ·vmstat· // 对于 IO,我们常关注三个部分:一般这几个值偏大,都意味着系统 IO 的消耗较大,对于读请求较大的服务器,b、bo、wa 的值偏大,而写请求较大的服务器,b、bi、wa 的值偏大。
- b 值:表示因为 IO 阻塞排队的任务数
- bi 和 bo 值:表示每秒读写磁盘的块数,bi(block in)是写磁盘,bo(block out)是读磁盘。
- wa 值:表示因为 IO 等待(wait)而消耗的 CPU 比例。
- `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·
★,之网络篇:`yum provides $(which ping)` //查看ping命令属于哪个包。
- ping:测试网络连通性
- ifconfig:接口配置
- ip:网络接口统计信息
- netsat:多种网络栈和接口统计信息
- ifstat:接口网络流量监控工具
- netcat:快速构建网络连接
- tcpdump:抓包工具
- sar:统计信息历史
- traceroute:测试网络路由
- pathchar:确定网络路径特征
- dtrace:TCP/IP 栈跟踪
- iperf / netperf / netserver:网络性能测试工具
- perf 性能分析神器
★,之显卡篇:
- lspci | grep -i vga //Linux查看显卡信息
- lspci | grep -i nvidia //英伟达显卡
(base) [root@master25 ~]$lspci |grep -i nvi 3b:00.0 VGA compatible controller: NVIDIA Corporation Device 2208 (rev a1) //这个是nvidia 3080TI显卡 3b:00.1 Audio device: NVIDIA Corporation Device 1aef (rev a1)
由于没有驱动信息,无法查询显卡的具体型号,不过可以通过nvidia官方网站查询。将上面输出中的代号(2208 或 1aef)输入文本框即可。
- lspci -v -s 3b:00.0 //查看指定显卡的详细信息。3b:00.0是显卡代号,lspci的输出最前面即是此信息。
- sudo lshw -c display// 查看显卡信息
- -c后的值可以通过 lshw -short获取
- nvidia-smi // Nvidia自带一个命令行工具可以查看显存的使用情况。`nvidia-smi --help`
[root@167 ~]$nvidia-smi Fri Feb 10 16:11:31 2023 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 515.86.01 Driver Version: 515.86.01 CUDA Version: 11.7 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 NVIDIA GeForce ... Off | 00000000:3B:00.0 Off | N/A | | 30% 32C P8 25W / 350W | 234MiB / 12288MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=============================================================================| | 0 N/A N/A 1302 G /usr/lib/xorg/Xorg 217MiB | | 0 N/A N/A 1594 G /usr/bin/gnome-shell 15MiB | +-----------------------------------------------------------------------------+ 表头释义: Fan:显示风扇转速,数值在0到100%之间,是计算机的期望转速,如果计算机不是通过风扇冷却或者风扇坏了,显示出来就是N/A; Temp:显卡内部的温度,单位是摄氏度; Perf:表征性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能; Pwr:能耗表示; Bus-Id:涉及GPU总线的相关信息; Disp.A:是Display Active的意思,表示GPU的显示是否初始化; Memory Usage:显存的使用率; Volatile GPU-Util:浮动的GPU利用率; Compute M:计算模式; 下边的Processes显示每块GPU上每个进程所使用的显存情况。
- ·nvidia-smi -L· // 列出所有可用的Nvidia设备。可以输出显卡型号,如RTX3080Ti
[root@167 ~]$nvidia-smi -L GPU 0: NVIDIA GeForce RTX 3080 Ti (UUID: GPU-96bfb1d3-986f-e92a-4f68-a600bd8a144c)
- ·nvidia-smi -L· // 列出所有可用的Nvidia设备。可以输出显卡型号,如RTX3080Ti
-
在Linux上,您可以将GPU设置为持久模式:
nvidia-smi -pm 1
。持久模式每个闲置的GPU使用更多的功率,但是可以防止每次启动GPU应用程序时出现相当长的延迟。在Windows上,nvidia-smi无法设置持久性模式。 相反,您需要将计算GPU设置为TCC模式。 这应该通过NVIDIA的图形GPU设备管理面板来完成。执行 nvidia-smi 命令,可查看Persistence Mode当前状态。Persistence-M的值为On时,持续模式为打开状态,如下图所示:
※,
标签:查看,GPU,硬件,命令,内存,IO,Linux,磁盘,CPU From: https://www.cnblogs.com/everest33Tong/p/18348716