200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > linux系统中的基础监控(硬盘 内存 系统负载 CPU 网络等)

linux系统中的基础监控(硬盘 内存 系统负载 CPU 网络等)

时间:2020-03-23 20:28:13

相关推荐

linux系统中的基础监控(硬盘 内存 系统负载 CPU 网络等)

Linux系统常见日常监控

系统信息

查看 CentOS 版本号:cat /etc/redhat-release

综合监控

nmon

系统负载

命令:w(判断整体瓶颈)

12:04:52 up 16 days, 12:54, 1 user, load average: 0.06, 0.13, 0.12USERTTYFROM LOGIN@ IDLE JCPU PCPU WHATrootpts/0 116.21.24.8511:57 4.00s 16:18 0.01s w

第一行:12:04:52表示当前系统时间up 16 days表示系统运行时间1 user表示登录用户数load average表示平均负载,0.06 表示一分钟内系统的平均负载值,0.13 表示五分钟内系统的平均负载值,0.12 表示十五分钟内系统的平均负载值。一般这个字不要超过服务器的 CPU 线程数(process)就没有关系。 查看 CPU 总的线程数:grep 'processor' /proc/cpuinfo | sort -u | wc -l第二行: 开始表示各个登录用户的情况,当前登录者是 root,登录者 IP 116.21.24.85还有一个简化版本的命令:uptime

10:56:16 up 26 days, 20:05, 1 user, load average: 0.00, 0.01, 0.05

命令:vmstat(判断 RAM 和 I/0 瓶颈)

命令:vmstat 5 10,每 5 秒采样一次,共 10 次。

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st2 00 726480 674564 0 007 0 26 1 1 99 0 00 00 726480 674596 0 000 442 557 1 0 99 0 00 00 726480 674596 0 00 12 438 574 0 1 99 0 00 00 726480 674596 0 000 430 540 0 0 100 0 00 00 726480 674596 0 000 448 567 0 1 99 0 00 00 726480 674596 0 000 459 574 1 0 99 0 00 00 726480 674596 0 000 425 543 0 1 99 0 00 00 722760 674600 0 000 480 643 2 3 95 0 0

第二行:r表示运行和等待CPU时间片的进程数,该数字如果长期大于服务器CPU的进程数,则说明CPU不够用了。b表示等待资源的进程数,比如等I/O,内存等。该数字如果长时间大于 1,则需要关注一下。si表示由交换区写入到内存的数据量so表示由内存写入到交换区的数据量如果 si 和 so 的数字比较高,并且不断变化时,说明内存不够了。而且不断变化也表示对系统性能影响很大。bi表示从块设备读取数据的量(读磁盘)bo表示从块设备写入数据的量(写磁盘)如果bi和bo两个数字比较高,则说明,磁盘IO压力大。in每秒 CPU 的中断次数,包括时间中断cs每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目wa表示I/O等待所占用CPU的时间比

命令:sar(综合)

sar(system activity reporter 系统活动情况报告)sar 是目前 linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动情况进行报告。包括(文件的读写、系统调用、磁盘I/O、cpu效率、内存使用、进程活动以及IPC有关的活动)如果没安装,运行:yum install -y sysstat
sar 之 CPU 使用情况(判断 CPU 瓶颈)
命令:sar -u 5 10,每 5 秒采样一次,共 10 次

01:57:29 PMCPU%user%nice %system %iowait %steal%idle01:57:34 PMall1.810.000.400.000.0097.7801:57:39 PMall0.200.000.400.000.0099.3901:57:44 PMall0.400.000.600.000.0098.9901:57:49 PMall0.200.000.400.000.0099.3901:57:54 PMall0.800.001.410.000.0097.7901:57:59 PMall0.400.000.600.000.0098.9901:58:04 PMall0.200.000.400.000.0099.3901:58:09 PMall0.200.000.400.000.0099.3901:58:14 PMall0.400.000.610.000.0098.9901:58:19 PMall0.200.000.610.000.0099.19Average: all0.480.000.590.000.0098.93

列说明:CPU:all表示统计信息为所有 CPU的平均值。%user:显示在用户级别(application)运行使用 CPU 总时间的百分比。%nice:显示在用户级别,用于nice操作,所占用 CPU总时间的百分比。%system:在核心级别(kernel)运行所使用 CPU总时间的百分比。%iowait:显示用于等待I/O操作占用 CPU总时间的百分比。%steal:管理程序(hypervisor)为另一个虚拟进程提供服务而等待虚拟 CPU 的百分比。%idle:显示 CPU空闲时间占用 CPU总时间的百分比。总结: 1.若%iowait的值过高,表示硬盘存在I/O瓶颈2.若%idle的值高但系统响应慢时,有可能是 CPU 等待分配内存,此时应加大内存容量,可以使用内存监控命令分析内存。3.若%idle的值持续低于1,则系统的 CPU 处理能力相对较低,表明系统中最需要解决的资源是 CPU。

sar 之 RAM 使用情况(判断内存瓶颈)
命令:sar -B 5 10,每 5 秒采样一次,共 10 次

02:32:15 PM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff02:32:20 PM0.000.81 258.470.0027.220.000.000.000.0002:32:25 PM0.000.00 611.540.00 300.200.000.000.000.0002:32:30 PM0.0026.6110.080.0011.900.000.000.000.0002:32:35 PM0.001.623.640.003.840.000.000.000.0002:32:40 PM0.000.003.420.004.430.000.000.000.0002:32:45 PM0.000.003.430.003.830.000.000.000.0002:32:50 PM0.001.623.840.005.860.000.000.000.0002:32:55 PM0.000.003.410.003.820.000.000.000.0002:33:00 PM0.002.42 763.840.00 208.690.000.000.000.0002:33:05 PM0.0013.74 2409.700.00 929.700.000.000.000.00Average: 0.004.68 406.500.00 149.690.000.000.000.00

pgpgin/s:表示每秒从磁盘或SWAP置换到内存的字节数(KB)pgpgout/s:表示每秒从内存置换到磁盘或SWAP的字节数(KB)fault/s:每秒钟系统产生的缺页数,即主缺页与次缺页之和(major + minor)majflt/s:每秒钟产生的主缺页数pgfree/s:每秒被放入空闲队列中的页个数pgscank/s:每秒被kswapd扫描的页个数pgscand/s:每秒直接被扫描的页个数pgsteal/s:每秒钟从cache中被清除来满足内存需要的页个数%vmeff:每秒清除的页(pgsteal)占总扫描页(pgscank+pgscand)的百分比

sar 之 I/O 使用情况(判断 I/O 瓶颈)
命令:sar -b 5 10,每 5 秒采样一次,共 10 次

02:34:13 PM tpsrtpswtps bread/s bwrtn/s02:34:18 PM3.030.003.030.0059.8002:34:23 PM0.000.000.000.000.0002:34:28 PM0.000.000.000.000.0002:34:33 PM0.000.000.000.000.0002:34:38 PM1.610.001.610.0024.8002:34:43 PM0.000.000.000.000.0002:34:48 PM0.400.000.400.004.8602:34:53 PM0.000.000.000.000.0002:34:58 PM0.000.000.000.000.0002:35:03 PM0.000.000.000.000.00Average: 0.500.000.500.008.94

tps:每秒钟物理设备的 I/O 传输总量rtps:每秒钟从物理设备读入的数据总量wtps:每秒钟向物理设备写入的数据总量bread/s:每秒钟从物理设备读入的数据量,单位为块/sbwrtn/s:每秒钟向物理设备写入的数据量,单位为块/s

sar 之 DEV(网卡)流量查看(判断网络瓶颈)
命令:sar -n DEV,查看网卡历史流量(因为是按时间显示每棵的流量,所以有很多)如果要动态显示当前的网卡流量:sar -n DEV 1采样收集网卡流量:sar -n DEV 5 10,每 5 秒采样一次,共 10 次如果要查看其他日期下的记录,可以到这个目录下:cd /var/log/sa查看下记录的文件,然后选择一个文件,比如:sar -n DEV -f /var/log/sa/sa01

01:46:24 PMIFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s01:46:25 PM lo3.003.000.180.180.000.000.0001:46:25 PMeth04.004.000.550.560.000.000.00

01:46:25 PM表示时间

IFACE表示网卡名称

rxpck/s每秒钟接收到的包数目,一般如果这个数字大于 4000 一般是被攻击了。

txpck/s每秒钟发送出去的包数目

rxkB/s每秒钟接收到的数据量(单位kb),一般如果这个数字大于 5000 一般是被攻击了。

txkB/s每秒钟发送出去的数据量(单位kb)

rxcmp/s:每秒钟接收到的压缩包数目

txcmp/s:每秒钟发送出去的压缩包数目

txmcst/s:每秒钟接收到的多播包的包数目

查看 TCP 相关的一些数据(每隔 1 秒采样一次,一共 5 次):sar -n TCP,ETCP 1 5

Linux 3.10.0-693.2.2.el7.x86_64 (youmeek) 07/17/ _x86_64_(2 CPU)12:05:47 PM active/s passive/s iseg/s oseg/s12:05:48 PM0.000.001.000.0012:05:47 PM atmptf/s estres/s retrans/s isegerr/s orsts/s12:05:48 PM0.000.000.000.000.0012:05:48 PM active/s passive/s iseg/s oseg/s12:05:49 PM0.000.001.001.0012:05:48 PM atmptf/s estres/s retrans/s isegerr/s orsts/s12:05:49 PM0.000.000.000.000.0012:05:49 PM active/s passive/s iseg/s oseg/s12:05:50 PM0.000.001.001.0012:05:49 PM atmptf/s estres/s retrans/s isegerr/s orsts/s12:05:50 PM0.000.000.000.000.0012:05:50 PM active/s passive/s iseg/s oseg/s12:05:51 PM0.000.003.003.0012:05:50 PM atmptf/s estres/s retrans/s isegerr/s orsts/s12:05:51 PM0.000.000.000.000.0012:05:51 PM active/s passive/s iseg/s oseg/s12:05:52 PM0.000.001.001.0012:05:51 PM atmptf/s estres/s retrans/s isegerr/s orsts/s12:05:52 PM0.000.000.000.000.00Average:active/s passive/s iseg/s oseg/sAverage: 0.000.001.401.20Average:atmptf/s estres/s retrans/s isegerr/s orsts/sAverage: 0.000.000.000.000.00

- active/s:每秒钟本地主动开启的 tcp 连接,也就是本地程序使用 connect() 系统调用- passive/s:每秒钟从源端发起的 tcp 连接,也就是本地程序使用 accept() 所接受的连接- retrans/s: 每秒钟的 tcp 重传次数atctive 和 passive 的数目通常可以用来衡量服务器的负载:接受连接的个数(passive),下游连接的个数(active)。可以简单认为 active 为出主机的连接,passive 为入主机的连接;但这个不是很严格的说法,比如 loalhost 和 localhost 之间的连接。来自:/p/39893236

CPU 监控

CPU 的基本信息查看

Demo CPU 型号:Intel® Xeon® Processor E5-2620 v2(15M Cache, 2.10 GHz)该 CPU 显示的数据中有一项这个要注意:Intel® Hyper-Threading TechnologyYes。表示该 CPU 支持超线程cat /proc/cpuinfo,查看 CPU 总体信息grep 'physical id' /proc/cpuinfo | sort -u | wc -l,查看物理 CPU 个数 结果:2物理 CPU:物理 CPU 也就是机器外面就能看到的一个个 CPU,每个物理 CPU 还带有单独的风扇grep 'core id' /proc/cpuinfo | sort -u | wc -l,查看每个物理 CPU 的核心数量 结果:6,因为每个物理 CPU 是 6,所有 2 个物理 CPU 的总核心数量应该是:12核心数:一个核心就是一个物理线程,英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥 CPU 性能,意思是一个核心可以有多个线程。grep 'processor' /proc/cpuinfo | sort -u | wc -l,查看 CPU 总的线程数,一般也叫做:逻辑 CPU 数量 结果:24,正常情况下:CPU 的总核心数量 == CPU 线程数,但是如果该 CPU 支持超线程,那结果是:CPU 的总核心数量 X 2 == CPU 线程数线程数:线程数是一种逻辑的概念,简单地说,就是模拟出的 CPU 核心数。比如,可以通过一个 CPU 核心数模拟出 2 线程的 CPU,也就是说,这个单核心的 CPU 被模拟成了一个类似双核心 CPU 的功能。

CPU 监控

Linux 的 CPU 简单监控一般简单常用命令就是top命令:top -bn1,可以完全显示所有进程出来,但是不能实时展示数据,只能暂时命令当时的数据。top可以动态显示进程所占的系统资源,每隔 3 秒变一次,占用系统资源最高的进程放最前面。在top命令状态下还可以按数字键1显示各个 CPU 线程使用状态top命令状态下按shfit+m可以按照内存使用大小排序在top命令状态下按shfit+p可以按照CPU 使用大小排序展示数据上,%CPU 表示进程占用的 CPU 百分比,%MEM 表示进程占用的内存百分比mac 下不一样:要先输入 o,然后输入 cpu 则按 cpu 使用量排序,输入 rsize 则按内存使用量排序。

CPU 其他工具

htop 综合工具:yum install -y htop这几篇文章讲得很好,我没必要再贴过来了,大家自己看:htop 命令完胜 top 命令htop 命令详解mpstat 实时监控 CPU 状态:yum install -y sysstat可以具体到某个核心,比如我有 2 核的 CPU,因为 CPU 核心下标是从 0 开始,所以我要查看 0 的状况(间隔 3 秒获取一次指标,一共获取 5 次):mpstat -P 0 3 5打印总 CPU 和各个核心指标:mpstat -P ALL 1获取所有核心的平均值:mpstat 3 5

Linux 3.10.0-693.2.2.el7.x86_64 (iZwz998aag1ggy168n3wg2Z) 06/23/ _x86_64_(2 CPU)11:44:52 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle11:44:53 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0011:44:54 AM 0 1.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 99.0011:44:55 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.0011:44:56 AM 0 0.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 0.00 99.0011:44:57 AM 0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00Average: 0 0.20 0.00 0.20 0.00 0.00 0.00 0.00 0.00 0.00 99.60

%usr 用户进程消耗 CPU 情况%sys 系统进程消耗 CPU 情况%iowait 表示 CPU 等待 IO 时间占整个 CPU 周期的百分比%idle 显示 CPU 空闲时间占用 CPU 总时间的百分比

类似 top 的 pidstat

安装:yum install -y sysstat每隔 2 秒采样一次,一共 5 次:pidstat 2 5

Linux 3.10.0-693.el7.x86_64 (youmeek) 07/17/ _x86_64_(8 CPU)11:52:58 AM UID PID %usr %system %guest %CPU CPU Command11:53:00 AM016813 0.50 0.99 0.00 1.491 pidstat11:53:00 AM024757 50.99 12.87 0.00 63.860 java11:53:00 AM024799 60.40 3.47 0.00 63.865 java11:53:00 AM024841 99.50 7.43 0.00 100.000 java11:53:00 AM UID PID %usr %system %guest %CPU CPU Command11:53:02 AM024757 56.50 0.50 0.00 57.000 java11:53:02 AM024799 100.00 6.50 0.00 100.005 java11:53:02 AM024841 58.00 2.50 0.00 60.500 java11:53:02 AM UID PID %usr %system %guest %CPU CPU Command11:53:04 AM016813 0.00 1.00 0.00 1.002 pidstat11:53:04 AM024757 62.00 5.50 0.00 67.500 java11:53:04 AM024799 54.00 14.00 0.00 68.005 java11:53:04 AM024841 39.50 9.00 0.00 48.500 java11:53:04 AM UID PID %usr %system %guest %CPU CPU Command11:53:06 AM016813 0.50 0.50 0.00 1.002 pidstat11:53:06 AM024757 80.00 13.50 0.00 93.500 java11:53:06 AM024799 56.50 0.50 0.00 57.005 java11:53:06 AM024841 1.00 0.50 0.00 1.500 java11:53:06 AM UID PID %usr %system %guest %CPU CPU Command11:53:08 AM016813 0.00 0.50 0.00 0.502 pidstat11:53:08 AM024757 58.50 1.00 0.00 59.500 java11:53:08 AM024799 60.00 1.50 0.00 61.505 java11:53:08 AM024841 1.00 0.50 0.00 1.500 javaAverage:UID PID %usr %system %guest %CPU CPU CommandAverage: 016813 0.20 0.60 0.00 0.80- pidstatAverage: 024757 61.58 6.69 0.00 68.26- javaAverage: 024799 66.47 5.19 0.00 71.66- javaAverage: 024841 39.92 3.99 0.00 43.91- java

内存监控

Linux 的内存本质是虚拟内存,这样说是因为它的内存是:物理内存 + 交换分区。有一个内存模块来管理应用的内存使用。如果所以你内存大,可以考虑把 swap 分区改得小点或者直接关掉。但是,如果是用的云主机,一般是没交换分区的,free -g中的 Swap 都是 0。查看内存使用命令: 以 M 为容量单位展示数据:free -m以 G 为容量单位展示数据:free -gCentOS 6 和 CentOS 7 展示出来的数据有差别,CentOS 7 比较容易看,比如下面的数据格式是 CentOS 7 的free -g

total used freeshared buff/cache availableMem: 11 010 0 010Swap: 5 0 5

在以上结果中,其中可以用的内存是看available列。对于 CentOS 6 的系统可以使用下面命令:

[root@bogon ~]# free -mlttotal used freeshared bufferscachedMem: 1608015919 1600 27811934Low: 1608015919 160High: 000-/+ buffers/cache: 370612373Swap: 000Total: 1608015919 160

以上的结果重点关注是:-/+ buffers/cache,这一行代表实际使用情况。

pidstat 采样内存使用情况
安装:yum install -y sysstat每隔 2 秒采样一次,一共 3 次:pidstat -r 2 3

Linux 3.10.0-693.el7.x86_64 (youmeek) 07/17/ _x86_64_(8 CPU)11:56:34 AM UID PID minflt/s majflt/sVSZ RSS %MEM Command11:56:36 AM023960 168.810.00 108312 1124 0.01 pidstat11:56:36 AM0247578.420.00 9360696 3862788 23.75 java11:56:36 AM0247998.910.00 10424088 4988468 30.67 java11:56:36 AM02484111.390.00 10423576 4968428 30.54 java11:56:36 AM UID PID minflt/s majflt/sVSZ RSS %MEM Command11:56:38 AM023960 169.500.00 108312 1200 0.01 pidstat11:56:38 AM0247576.000.00 9360696 3862788 23.75 java11:56:38 AM0247995.500.00 10424088 4988468 30.67 java11:56:38 AM0248417.000.00 10423576 4968428 30.54 java11:56:38 AM UID PID minflt/s majflt/sVSZ RSS %MEM Command11:56:40 AM023960 160.000.00 108312 1200 0.01 pidstat11:56:40 AM0247576.500.00 9360696 3862788 23.75 java11:56:40 AM0247996.000.00 10424088 4988468 30.67 java11:56:40 AM0248418.000.00 10423576 4968428 30.54 javaAverage:UID PID minflt/s majflt/sVSZ RSS %MEM CommandAverage: 023960 166.110.00 108312 1175 0.01 pidstatAverage: 0247576.980.00 9360696 3862788 23.75 javaAverage: 0247996.810.00 10424088 4988468 30.67 javaAverage: 0248418.800.00 10423576 4968428 30.54 java

硬盘监控

硬盘容量相关查看

df -h:自动以合适的磁盘容量单位查看磁盘大小和使用空间df -m:以磁盘容量单位 M 为数值结果查看磁盘使用情况du -sh /opt/tomcat6:查看tomcat6这个文件夹大小 (h的意思human-readable用人类可读性较好方式显示,系统会自动调节单位,显示合适大小的单位)du /opt --max-depth=1 -h:查看指定录入下包括子目录的各个文件大小情况

命令:iostat(判断 I/0 瓶颈)

命令:iostat -x -k 3 3,每 3 秒采样一次,共 3 次。

avg-cpu: %user %nice %system %iowait %steal %idle0.55 0.00 0.52 0.00 0.00 98.93Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilvda0.000.04 0.02 0.620.446.49 21.650.00 1.42 1.17 1.42 0.25 0.02avg-cpu: %user %nice %system %iowait %steal %idle0.34 0.00 0.00 0.00 0.00 99.66Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilvda0.000.00 0.00 0.000.000.000.000.00 0.00 0.00 0.00 0.00 0.00avg-cpu: %user %nice %system %iowait %steal %idle2.02 0.00 0.34 0.00 0.00 97.64Device: rrqm/s wrqm/sr/sw/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilvda0.000.00 0.00 1.680.00 16.16 19.200.00 0.20 0.00 0.20 0.20 0.03

列说明:rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并wrqm/s: 每秒对该设备的写请求被合并次数r/s: 每秒完成的读次数w/s: 每秒完成的写次数rkB/s: 每秒读数据量(kB为单位)wkB/s: 每秒写数据量(kB为单位)avgrq-sz:平均每次IO操作的数据量(扇区数为单位)avgqu-sz: 平均等待处理的IO请求队列长度(队列长度大于 1 表示设备处于饱和状态。)await: 系统发往 IO 设备的请求的平均响应时间(毫秒为单位)。这包括请求排队的时间,以及请求处理的时间。超过经验值的平均响应时间表明设备处于饱和状态,或者设备有问题。svctm: 平均每次IO请求的处理时间(毫秒为单位)%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率(就是繁忙程度,值越高表示越繁忙)总结iowait%表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题。%util(重点参数)表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态

硬盘 IO 监控

安装 iotop:yum install -y iotop

查看所有进程 I/O 情况命令:iotop

只查看当前正在处理 I/O 的进程:iotop -o

只查看当前正在处理 I/O 的线程,每隔 5 秒刷新一次:iotop -o -d 5

只查看当前正在处理 I/O 的进程(-P 参数决定),每隔 5 秒刷新一次:iotop -o -P -d 5

只查看当前正在处理 I/O 的进程(-P 参数决定),每隔 5 秒刷新一次,使用 KB/s 单位(默认是 B/s):iotop -o -P -k -d 5

使用 dd 命令测量服务器延迟:dd if=/dev/zero of=/opt/ioTest2.txt bs=512 count=1000 oflag=dsync

使用 dd 命令来测量服务器的吞吐率(写速度):dd if=/dev/zero of=/opt/ioTest1.txt bs=1G count=1 oflag=dsync

该命令创建了一个 10M 大小的文件 ioTest1.txt,其中参数解释:if 代表输入文件。如果不指定 if,默认就会从 stdin 中读取输入。of 代表输出文件。如果不指定 of,默认就会将 stdout 作为默认输出。bs 代表字节为单位的块大小。count 代表被复制的块数。/dev/zero 是一个字符设备,会不断返回0值字节(\0)。oflag=dsync:使用同步I/O。不要省略这个选项。这个选项能够帮助你去除 caching 的影响,以便呈现给你精准的结果。conv=fdatasyn: 这个选项和 oflag=dsync 含义一样。

该命令执行完成后展示的数据:

[root@youmeek ~]# dd if=/dev/zero of=/opt/ioTest1.txt bs=1G count=1 oflag=dsync记录了1+0 的读入记录了1+0 的写出1073741824字节(1.1 GB)已复制,5.43328 秒,198 MB/秒

利用 hdparm 测试硬盘速度:yum install -y hdparm查看硬盘分区情况:df -h,然后根据分区测试:测试硬盘分区的读取速度:hdparm -T /dev/sda测试硬盘分区缓存的读取速度:hdparm -t /dev/sda也可以以上两个参数一起测试:hdparm -Tt /dev/sda,结果数据如下:

/dev/sda:Timing cached reads: 3462 MB in 2.00 seconds = 1731.24 MB/secTiming buffered disk reads: 806 MB in 3.00 seconds = 268.52 MB/sec

pidstat 采样硬盘使用情况
安装:yum install -y sysstat每隔 2 秒采样一次,一共 3 次:pidstat -d 2 3

Linux 3.10.0-693.el7.x86_64 (youmeek) 07/17/ _x86_64_(8 CPU)11:57:29 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command11:57:31 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command11:57:33 AM0247570.002.000.00 java11:57:33 AM0247990.0014.000.00 java11:57:33 AM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command11:57:35 AM0248410.008.000.00 javaAverage:UID PID kB_rd/s kB_wr/s kB_ccwr/s CommandAverage: 0247570.000.660.00 javaAverage: 0247990.004.650.00 javaAverage: 0248410.002.660.00 java

输出指标含义:

kB_rd/s: 每秒进程从磁盘读取的数据量(以 kB 为单位)kB_wr/s: 每秒进程向磁盘写的数据量(以 kB 为单位)kB_ccwr/s:任务取消的写入磁盘的 KB。当任务截断脏的 pagecache 的时候会发生。

网络监控

网络监控常用

安装 iftop(需要有 EPEL 源):yum install -y iftop如果没有 EPEL 源:yum install -y epel-release常用命令:iftop:默认是监控第一块网卡的流量iftop -i eth0:监控 eth0iftop -n:直接显示IP, 不进行DNS反解析iftop -N:直接显示连接埠编号, 不显示服务名称iftop -F 192.168.1.0/24 or 192.168.1.0/255.255.255.0:显示某个网段进出封包流量iftop -nP:显示端口与 IP 信息

中间部分:外部连接列表,即记录了哪些ip正在和本机的网络连接右边部分:实时参数分别是该访问 ip 连接到本机 2 秒,10 秒和 40 秒的平均流量=> 代表发送数据,<= 代表接收数据底部会显示一些全局的统计数据,peek 是指峰值情况,cumm 是从 iftop 运行至今的累计情况,而 rates 表示最近 2 秒、10 秒、40 秒内总共接收或者发送的平均网络流量。TX:(发送流量) cumm: 143MB peak: 10.5Mb rates: 1.03Mb 1.54Mb 2.10Mb RX:(接收流量) 12.7GB 228Mb 189Mb 191Mb 183Mb TOTAL:(总的流量) 12.9GB 229Mb 190Mb 193Mb 185MbW

端口使用情况(也可以用来查看端口占用)

lsof

安装 lsof:yum install -y lsof查看 3316 端口是否有被使用(macOS 也适用):lsof -i:3316,有被使用会输出类似如下信息,如果没被使用会没有任何信息返回

COMMANDPID USER FD TYPE DEVICE SIZE/OFF NODE NAMEjava1 root 77u IPv6 45068420t0 TCP JDu4e00u53f7:58560->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 78u IPv6 45068430t0 TCP JDu4e00u53f7:58576->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 79u IPv6 45068440t0 TCP JDu4e00u53f7:58578->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 80u IPv6 45068450t0 TCP JDu4e00u53f7:58574->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 82u IPv6 45068460t0 TCP JDu4e00u53f7:58562->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 83u IPv6 45068470t0 TCP JDu4e00u53f7:58564->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 84u IPv6 45068480t0 TCP JDu4e00u53f7:58566->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 85u IPv6 45068490t0 TCP JDu4e00u53f7:58568->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 86u IPv6 45068500t0 TCP JDu4e00u53f7:58570->116.196.110.69:aicc-cmi (ESTABLISHED)java1 root 87u IPv6 45068510t0 TCP JDu4e00u53f7:58572->116.196.110.69:aicc-cmi (ESTABLISHED)docker-pr 13551 root 4u IPv6 21168240t0 TCP *:aicc-cmi (LISTEN)

netstat

更多用法可以看:netstat 的10个基本用法查看所有在用的端口(macOS 也适用):netstat -ntlp

Active Internet connections (only servers)Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 00 0.0.0.0:111 0.0.0.0:*LISTEN1/systemd tcp 00 0.0.0.0:22 0.0.0.0:*LISTEN746/sshd tcp 00 127.0.0.1:32000 0.0.0.0:*LISTEN1/javatcp6 00 :::9066 :::*LISTEN1/javatcp6 00 :::6379 :::*LISTEN28668/docker-proxy tcp6 00 :::111 :::*LISTEN1/systemd tcp6 00 :::3316 :::*LISTEN13551/docker-proxy tcp6 00 :::22 :::*LISTEN746/sshd tcp6 00 :::35224:::*LISTEN1/javatcp6 00 :::3326 :::*LISTEN14203/docker-proxy tcp6 00 :::1984 :::*LISTEN1/javatcp6 00 :::8066 :::*LISTEN1/javatcp6 00 :::43107:::*LISTEN1/java

查看当前连接80端口的机子有多少,并且是属于什么状态:netstat -an|grep 80|sort -r查看已经连接的IP有多少连接数:netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n查看已经连接的IP有多少连接数,只显示前 5 个:netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n | head -5查看每个 ip 跟服务器建立的连接数:netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn

262 127.0.0.1118103 172.22.100.14112 172.22.100.297 172.22.100.1836 116.21.17.1446 0.0.0.05 192.168.1.1094 172.22.100.324 172.22.100.1214 172.22.100.1084 172.18.1.393 172.22.100.23 172.22.100.190

统计当前连接的一些状态情况:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'或者netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

TIME_WAIT 96(是表示系统在等待客户端响应,以便再次连接时候能快速响应,如果积压很多,要开始注意了,准备阻塞了。这篇文章可以看下:/jschu/1728001)CLOSE_WAIT 11(如果积压很多,要开始注意了,准备阻塞了。可以看这篇文章:/net881004/2164020)FIN_WAIT2 17ESTABLISHED 102(表示正常数据传输状态)

TIME_WAIT 和 CLOSE_WAIT 说明:

Linux 系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态 的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。来源:/?p=219=================================出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是另一端由于正在读写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。Linux分配给一个用户的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,一旦达到句柄数上限,新的请求就无法被处理了,接着就是大量Too Many Open Files异常,导致tomcat崩溃。关于TIME_WAIT过多的解决方案参见TIME_WAIT数量太多。常见错误原因:1.代码层面上未对连接进行关闭,比如关闭代码未写在 finally 块关闭,如果程序中发生异常就会跳过关闭代码,自然未发出指令关闭,连接一直由程序托管,内核也无权处理,自然不会发出 FIN 请求,导致连接一直在 CLOSE_WAIT 。2.程序响应过慢,比如双方进行通讯,当客户端请求服务端迟迟得不到响应,就断开连接,重新发起请求,导致服务端一直忙于业务处理,没空去关闭连接。这种情况也会导致这个问题。一般如果有多个节点,nginx 进行负载,其中某个节点很高,其他节点不高,那可能就是负载算法不正常,都落在一台机子上了,以至于它忙不过来。来源:https://juejin.im/post/5b59e61ae51d4519634fe257

查看网络接口接受、发送的数据包情况(每隔 3 秒统计一次):netstat -i 3

Kernel Interface tableIfaceMTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flgeth01500 1090329800 010847741000 BMRUlo 65536 45365000 0 453650000 LRUeth01500 1090333500 010847777000 BMRUlo 65536 45365000 0 453650000 LRUeth01500 1090336300 010847798000 BMRUlo 65536 45365000 0 453650000 LRUeth01500 1090339300 010847836000 BMRUlo 65536 45365000 0 453650000 LRUeth01500 1090343700 010847867000 BMRUlo 65536 45365000 0 453650000 LRU

接收(该值是历史累加数据,不是瞬间数据,要计算时间内的差值需要自己减): RX-OK 已接收字节数RX-ERR 已接收错误字节数(数据值大说明网络存在问题)RX-DRP 已丢失字节数(数据值大说明网络存在问题)RX-OVR 由于误差而遗失字节数(数据值大说明网络存在问题)发送(该值是历史累加数据,不是瞬间数据,要计算时间内的差值需要自己减): TX-OK 已发送字节数TX-ERR 已发送错误字节数(数据值大说明网络存在问题)TX-DRP 已丢失字节数(数据值大说明网络存在问题)TX-OVR 由于误差而遗失字节数(数据值大说明网络存在问题)

网络排查

ping 命令查看丢包、域名解析地址ping 116.196.110.69pingtelnet 测试端口的连通性(验证服务的可用性)yum install -y telnettelnet 116.196.110.68 3306telnet 80tracert(跟踪路由)查看网络请求节点访问情况,用于确定 IP 数据报访问目标所采取的路径。yum install -y traceroutetraceroutenslookup 命令查看 DNS 是否可用yum install -y bind-utils输入:nslookup,然后终端进入交互模式,然后输入:,此时会展示类似这样的信息:

Server:103.224.222.221(这个是你本机的信息)Address:103.224.222.221#53(这个是你本机的信息)(下面是百度的信息)Non-authoritative answer:canonical name = www..Name:www.Address: 220.181.112.244Name:www.Address: 220.181.111.188

此时我们假设换个 DNS,我们在刚刚的交互阶段继续输入:server 8.8.8.8,表示我们此时用 8.8.8.8 的 DNS,然后我们在交互中再输入:,此时会出现这个信息:

Server:8.8.8.8Address:8.8.8.8#53Non-authoritative answer:canonical name = www..Name:www.Address: 180.97.33.108Name:www.Address: 180.97.33.107

以上表明,不同的 DNS 情况下,我们获取到的域名所属 IP 是不同的。

查看 Linux 内核版本

对于一些复杂的层面问题,一般都要先确认内核版本,好帮助分析:uname -r

3.10.0-693.2.2.el7.x86_64

dmesg 打印内核信息

开机信息存在:tail -500f /var/log/dmesg查看尾部信息:dmesg -T | tail参数-T表示显示时间只显示 error 和 warning 信息:dmesg --level=err,warn -T有些 OOM 的错误会在这里显示,比如:

[1880957.563400] Out of memory: Kill process 18694 (perl) score 246 or sacrifice child[1880957.563408] Killed process 18694 (perl) total-vm:1972392kB, anon-rss:1953348kB, file-rss:0kB

查看系统日志

查看系统日志:tail -400f /var/log/messages可能会看到类似以下异常:

Out of memory: Kill process 19452 (java) score 264 or sacrifice child

服务器故障排查顺序

请求时好时坏

系统层面 查看负载、CPU、内存、上线时间、高资源进程 PID:htop查看网络丢失情况:netstat -i 3,关注:RX-DRP、TX-DRP,如果两个任何一个有值,或者都有值,肯定是网络出了问题(该值是历史累加数据,不是瞬间数据)。应用层面 临时修改 nginx log 输出格式,输出完整信息,包括请求头

$request_body 请求体(含POST数据)$http_XXX 指定某个请求头(XXX为字段名,全小写)$cookie_XXX指定某个cookie值(XXX为字段名,全小写)类似用法:log_format special_main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$request_body" "$http_referer" ''"$http_user_agent" $http_x_forwarded_for "appid=$http_appid,appver=$http_appver,vuser=$http_vuser" ''"phpsessid=$cookie_phpsessid,vuser_cookie=$cookie___vuser" ';access_log /home/wwwlogs/hicrew.log special_main;

CPU 高,负载高,访问慢(没有数据库)

记录负载开始升高的时间常见场景 虚拟机所在的宿主机资源瓶颈,多个虚拟机竞争资源定时任务大量的任务并发消息、请求堆积后恢复时的瞬时流量引起持久化任务引起更多可以看这篇:线上异常排查总结系统层面 查看负载、CPU、内存、上线时间、高资源进程 PID:htop查看磁盘使用情况:df -h查看磁盘当前情况:iostat -x -k 3 3。如果发现当前磁盘忙碌,则查看是哪个 PID 在忙碌:iotop -o -P -k -d 5查看 PID 具体在写什么东西:lsof -p PID查看系统日志:tail -400f /var/log/messages查看简化线程树:pstree -a >> /opt/pstree-0915.log其他机子 ping(多个地区 ping),看下解析 IP 与网络丢包查看网络节点情况:tracerouteifconfig查看 dropped 和 error 是否在不断增加,判断网卡是否出现问题nslookup命令查看 DNS 是否可用如果 nginx 有安装:http_stub_status_module 模块,则查看当前统计查看 TCP 和 UDP 应用netstat -ntlpnetstat -nulp统计当前连接的一些状态情况:netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn查看每个 ip 跟服务器建立的连接数:netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn查看与后端应用端口连接的有多少:lsof -i:8080|grep 'TCP'|wc -l跟踪程序(按Ctrl + C停止跟踪):strace -tt -T -v -f -e trace=file -o /opt/strace-0915.log -s 1024 -p PID看下谁在线:wlast看下执行了哪些命令:history程序、JVM 层面 保存、查看 Nginx 程序 log 通过 GoAccess 分析 log保存、查看 Java 程序 log使用内置 tomcat-manager 监控配置,或者使用类似工具:psi-probe使用ps -ef | grep java,查看进程 PID 根据高 CPU 的进程 PID,查看其线程 CPU 使用情况:top -Hp PID,找到占用 CPU 资源高的线程 PID保存堆栈情况:jstack -l PID >> /opt/jstack-tomcat1-PID-0917.log把占用 CPU 资源高的线程十进制的 PID 转换成 16 进制:printf "%x\n" PID,比如:printf "%x\n" 12401得到结果是:3071在刚刚输出的那个 log 文件中搜索:3071,可以找到:nid=0x3071使用jstat -gc PID 10000 10,查看gc情况(截图)使用jstat -gccause PID:额外输出上次GC原因(截图)使用jstat -gccause PID 10000 10:额外输出上次GC原因,收集 10 次,每隔 10 秒使用jmap -dump:format=b,file=/opt/dumpfile-tomcat1-PID-0917.hprof PID,生成堆转储文件 使用 jhat 或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。结合代码解决内存溢出或泄露问题。给 VM 增加 dump 触发参数:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat-1.hprof

一次 JVM 引起的 CPU 高排查

使用ps -ef | grep java,查看进程 PID 根据高 CPU 的进程 PID,查看其线程 CPU 使用情况:top -Hp PID,找到占用 CPU 资源高的线程 PID保存堆栈情况:jstack -l PID >> /opt/jstack-tomcat1-PID-1017.log把占用 CPU 资源高的线程十进制的 PID 转换成 16 进制:printf "%x\n" PID,比如:printf "%x\n" 12401得到结果是:3071在刚刚输出的那个 log 文件中搜索:3071,可以找到:nid=0x3071也可以在终端中直接看:jstack PID |grep 十六进制线程 -A 30,此时如果发现如下:

"GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007fd0ac01f000 nid=0x66f runnable

这种情况一般是 heap 设置得过小,而又要频繁分配对象;二是内存泄露,对象一直不能被回收,导致 CPU 占用过高使用:jstat -gcutil PID 3000 10:正常情况结果应该是这样的:

S0S1EOMCCS YGCYGCT FGC FGCTGCT0.00 0.00 67.63 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.68 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.71 38.09 78.03 68.82 124 0.9665 0.778 1.7440.00 0.00 67.71 38.09 78.03 68.82 124 0.9665 0.778 1.744

S0:SO 当前使用比例S1:S1 当前使用比例E:Eden 区使用比例(百分比)(异常的时候,这里可能会接近 100%)O:old 区使用比例(百分比)(异常的时候,这里可能会接近 100%)M:Metaspace 区使用比例(百分比)(异常的时候,这里可能会接近 100%)CCS:压缩使用比例YGC:年轻代垃圾回收次数FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间(单位秒)GCT:垃圾回收消耗总时间(单位秒)异常的时候每次 Full GC 时间也可能非常长,每次时间计算公式=FGCT值/FGC指)jmap -heap PID,查看具体占用量是多大使用jmap -dump:format=b,file=/opt/dumpfile-tomcat1-PID-0917.hprof PID,生成堆转储文件(如果设置的 heap 过大,dump 下来会也会非常大) 使用 jhat 或者可视化工具(Eclipse Memory Analyzer 、IBM HeapAnalyzer)分析堆情况。一般这时候就只能根据 jhat 的分析,看源码了这里有几篇类似经历的文章推荐给大家: 三个神奇bug之Java占满CPUCPU 负载过高问题排查

CPU 低,负载高,访问慢(带数据库)

基于上面,但是侧重点在于 I/O 读写,以及是否有 MySQL 死锁,或者挂载了 NFS,而 NFS Server 出现问题mysql 下查看当前的连接数与执行的sql 语句:show full processlist;检查慢查询日志,可能是慢查询引起负载高,根据配置文件查看存放位置:log_slow_queries查看 MySQL 设置的最大连接数:show variables like 'max_connections';重新设置最大连接数:set GLOBAL max_connections=300

参考资料

/dd/article-6104-1.html/ggjucheng/archive//01/13/2858923.html/3649.html/archives/2456.html/blog/linux/sav.html/p/3991c0dba094/p/3667157d63bb/yjd_hycf_space/p/7755633.html//05/27/nginx-access-log.html

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。