linux服务器运维入门教程学习 (linux查询服务器运行日志的命令)

[TOC]

# 一、[uptime](https://man.linuxde.net/uptime) —— 查看系统负载均衡

>作用:快速查看系统总共运行了多长时间和系统的平均负载

**语法**

> uptime(选项)

**选项**

> -V:显示指令的版本信息。

**实例**

使用`uptime`命令查看系统负载:

> [root@LinServ-1 ~]# uptime -V #显示uptime命令版本信息

> procps version 3.2.7

>

> [root@LinServ-1 ~]# uptime

> 15:31:30 up 127 days, 3:00, 1 user, load average: 0.00, 0.00, 0.00

显示内容说明:

```

15:31:30 // 系统当前时间

up 127 days, 3:00 // 主机已运行时间,时间越大,说明你的机器越稳定。

1 user // 用户连接数,是总连接数而不是用户数

load average: 0.00, 0.00, 0.00 // 系统平均负载,统计最近1,5,15分钟的系统平均负载

```

通过average的这三个数据,可以了解服务器负载是在趋于紧张还是趋于缓解。

如果1分钟平均负载很高,而15分钟平均负载很低,说明服务器正在命令高负载情况,需要进一步排查CPU资源都消耗在了哪里。反之,如果15分钟平均负载很高,1分钟平均负载较低,则有可能是CPU资源紧张时刻已经过去。

**实例2**

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/uptime.png)

上面例子中的输出,可以看见最近1分钟的平均负载非常高,且远高于最近15分钟负载,因此我们需要继续排查当前系统中有什么进程消耗了大量的资源。可以通过下文将会介绍的vmstat、mpstat等命令进一步排查。

# 二、dmesg —— 帮助排查性能问题

> 作用:用于检查和控制内核的环形缓冲区。

> 注:kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息保存在`/var/log/dmesg`文件里

**语法**

> dmesg(选项)

**选项**

> -c:显示信息后,清除ring buffer中的内容;

> -s<缓冲区大小>:预设置为8196,刚好等于ring buffer的大小;

> -n:设置记录信息的层级。

**实例**

> [root@localhost ~]# dmesg | head

> Linux version 2.6.18-348.6.1.el5 (mockbuild@builder17.centos.org) (gcc version > 4.1.2 20080704 (Red Hat 4.1.2-54)) #1 SMP Tue May 21 15:34:22 EDT 2013

> BIOS-provided physical RAM map:

> BIOS-e820: 0000000000010000 - 000000000009f400 (usable)

> BIOS-e820: 000000000009f400 - 00000000000a0000 (reserved)

> BIOS-e820: 00000000000f0000 - 0000000000100000 (reserved)

> BIOS-e820: 0000000000100000 - 000000007f590000 (usable)

> BIOS-e820: 000000007f590000 - 000000007f5e3000 (ACPI NVS)

> BIOS-e820: 000000007f5e3000 - 000000007f5f0000 (ACPI data)

> BIOS-e820: 000000007f5f0000 - 000000007f600000 (reserved)

> BIOS-e820: 00000000e0000000 - 00000000e8000000 (reserved)

**实例2**

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/dmesg.png)

该命令会输出系统日志的最后10行。示例中的输出,可以看见一次内核的oom kill和一次TCP丢包。这些日志可以帮助排查性能问题。千万不要忘了这一步。

# 三、vmstat —— 了解系统状态

> 作用:显示虚拟内存状态,并且它可以报告关于进程、内存、I/O等系统整体运行状态。

**语法**

> vmstat(选项)(参数)

**选项**

> -a:显示活动内页;

> -f:显示启动后创建的进程总数;

> -m:显示slab信息;

> -n:头信息仅显示一次;

> -s:以表格方式显示事件计数器和内存状态;

> -d:报告磁盘状态;

> -p:显示指定的硬盘分区状态;

> -S:输出信息的单位。

**参数**

- 事件间隔:状态信息刷新的时间间隔;

- 次数:显示报告的次数。

**实例**

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/vmstat.png)

字段说明:

```

Procs(进程)

- r: 等待在CPU资源的进程数,这个值也可以判断是否需要增加CPU。(长期大于1)

注意:这个数据比平均负载更加能够体现CPU负载情况,数据中不包含等待IO的进程。如果这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。

- b: 等待IO的进程数量。

Memory(内存)

- swpd: 使用虚拟内存大小,如果swpd的值不为0,但是SI,SO的值长期为0,这种情况不会影响系统性能。

- free: 系统可用内存数。(以千字节为单位)

注意:如果剩余内存不足,也会导致系统性能问题。下文介绍到的free命令,可以更详细的了解系统内存的使用情况。

- buff: 用作缓冲的内存大小。

- cache: 用作缓存的内存大小,如果cache的值大的时候,说明cache处的文件数多,如果频繁访问到的文件都能被cache处,那么磁盘的读IO bi会非常小。

Swap

- si: 每秒从交换区写到内存的大小,由磁盘调入内存。(写入)

- so: 每秒写入交换区的内存大小,由内存调入磁盘。(读取)

注意:如果这个数据不为0,说明系统已经在使用交换区(swap),机器物理内存已经不足。

注意:内存够用的时候,这2个值都是0,如果这2个值长期大于0时,系统性能会受到影响,磁盘IO和CPU资源都会被消耗。有些朋友看到空闲内存(free)很少的或接近于0时,就认为内存不够用了,不能光看这一点,还要结合si和so,如果free很少,但是si和so也很少(大多时候是0),那么不用担心,系统性能这时不会受到影响的。

IO(现在的Linux版本块的大小为1kb)

- bi: 每秒读取的块数

- bo: 每秒写入的块数

注意:随机磁盘读写的时候,这2个值越大(如超出1024k),能看到CPU在IO等待的值也会越大。

system(系统)

- in: 每秒中断数,包括时钟中断。

- cs: 每秒上下文切换数。

注意:上面2个值越大,会看到由内核消耗的CPU时间会越大。

CPU(以百分比表示)

- us: 用户进程执行时间百分比(user time)

注意: us的值比较高时,说明用户进程消耗的CPU时间多,但是如果长期超50%的使用,那么我们就该考虑优化程序算法或者进行加速。

- sy: 内核系统进程执行时间百分比(system time)

注意:sy的值高时,说明系统内核消耗的CPU资源多,这并不是良性表现,我们应该检查原因。

- id: 空闲时间百分比

- wa: IO等待时间百分比 (IO等待时间(wait))

注意:wa的值高时,说明IO等待比较严重,这可能由于磁盘大量作随机访问造成,也有可能磁盘出现瓶颈(块操作)。

- st: 被偷走的时间(stolen,一般被其他虚拟机消耗)

```

上述这些CPU时间,可以让我们很快了解CPU是否出于繁忙状态。一般情况下,如果用户时间和系统时间相加非常大,CPU出于忙于执行指令。如果IO等待时间很长,那么系统的瓶颈可能在磁盘IO。

# 四、[mpstat](https://man.linuxde.net/mpstat) —— 显示每个CPU占用情况

> 作用:主要用于多CPU环境下,它显示各个可用CPU的状态系你想。

> 注:这些信息存放在/proc/stat文件中。在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。

**语法**

> mpstat(选项)(参数)

**选项**

> -P:指定CPU编号。

**参数**

- 间隔时间:每次报告的间隔时间(秒);

- 次数:显示报告的次数。

**安装命令**

```

yum install sysstat

```

> 注:`mpstat`并不是linux自带的命令,而是`sysstat`性能监控工具集的一个子集,因此要想使用必须安装`sysstat`

**实例**

当mpstat不带参数时,输出为从系统启动以来的平均值。

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/mpstat.png)

**每2秒产生了2个处理器的统计数据报告:**

下面的命令可以每2秒产生了2个处理器的统计数据报告,一共产生三个interval 的信息,然后再给出这三个interval的平均信息。默认时,输出是按照CPU 号排序。第一个行给出了从系统引导以来的所有活跃数据。接下来每行对应一个处理器的活跃状态。。

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/mpstat-p.png)

> 注:`mpstat`命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一个单线程应用程序引起的。

# 五、pidstat —— 监控进程占用的系统资源

> 作用:用于监控全部或指定进程占用系统资源的情况,如CPU,内存、设备IO、任务切换、线程等。

**语法**

> pidstat(选项)(时间间隔)(次数)

**参数**

```

-C comm #只显示那些包含字符串(可是正则表达式)comm的命令的名字

-d #显示I/O统计信息(须内核2.6.20及以后)

PID #进程号

kB_rd/s #每秒此进程从磁盘读取的千字节数

kB_wr/s #此进程已经或者将要写入磁盘的每秒千字节数

kB_ccwr/s #由任务取消的写入磁盘的千字节数

Command #命令的名字

-h #显示所有的活动的任务

-I #在SMP环境,指出任务的CPU使用(等同于选项-u)应该被除于cpu的总数

-l #显示进程的命令名和它的参数

-p { pid [,...] | SELF | ALL }#指定线程显示其报告

-r #显示分页错误的内存利用率

When reporting statistics for individual tasks, the following values are displayed:

PID #进程号

minflt/s #每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数

majflt/s #每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生

VSZ #该进程使用的虚拟内存(以kB为单位)

RSS #该进程使用的物理内存(以kB为单位)

%MEM #当前任务使用的有效内存的百分比

Command #任务的命令名

When reporting global statistics for tasks and all their children, the following values are displayed:

PID #PID号

minflt-nr #在指定的时间间隔内收集的进程和其子进程的次缺页错误次数

majflt-nr #在指定的时间间隔内收集的进程和其子进程的主缺页错误次数

Command #命令名

-s #堆栈的使用

-t #显示与所选任务相关的线程的统计数据

-T { TASK | CHILD | ALL } #指定必须监测的内容:TASK是默认的,单个任务的报告;CHILD:指定的进程和他们的子进程的全局报告,ALL:相当于TASK和CHILD

-u #报告CPU使用

When reporting statistics for individual tasks, the following values are displayed:

PID

%usr #用户层任务正在使用的CPU百分比(with or without nice priority ,NOT include time spent running a virtual processor)

%system #系统层正在执行的任务的CPU使用百分比

%guest #运行虚拟机的CPU占用百分比

%CPU #所有的使用的CPU的时间百分比

CPU #处理器数量

Command #命令

When reporting global statistics for tasks and all their children, the following values are displayed:

PID #PID号

usr-ms #在指定时间内收集的在用户层执行的进程和它的子进程占用的CPU时间(毫秒){with or without nice priority,NOT include time spent running a virtual processor)

system-ms #在指定时间内收集的在系统层执行的进程和它的子进程占用的CPU时间(毫秒)

guest-ms #花在虚拟机上的时间

Command #命令

-V #版本号

-w #报告任务切换情况

PID #PID号

cswch/s #每秒自动上下文切换

nvcswch/s #每秒非自愿的上下文切换

Command #命令

```

**实例1**

查看系统启动后所有活动进程的cpu统计信息

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/pidstat.png)

**实例2**

pidstat命令指定采样周期和采样次数,命令形式为”pidstat [option] interval [count]”

以下pidstat输出以2秒为采样周期,输出10次cpu使用统计信息:

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/pidstat-time.png)

**实例3**

pidstat将显示某活动进程的内存使用统计:

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/pidstat-rp.png)

**实例4**

查看进程IO的统计信息:

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/pidstat-d.png)

> 注:pidstat命令输出进程的CPU占用率,该命令会持续输出,并且不会覆盖之前的数据,可以方便观察系统动态。

# 六、[iostat](https://man.linuxde.net/iostat) —— 监视系统IO和CPU使用情况

> 作用:用于监视系统输入输出设备和CPU的使用情况。

**语法**

> iostat(选项)(参数)

**选项**

> -c:仅显示CPU使用情况;

> -d:仅显示设备利用率;

> -k:显示状态以千字节每秒为单位,而不使用块每秒;

> -m:显示状态以兆字节每秒为单位;

> -p:仅显示块设备和所有被使用的其他分区的状态;

> -t:显示每个报告产生时的时间;

> -V:显示版号并退出;

> -x:显示扩展状态。

**参数**

- 间隔时间:每次报告的间隔时间(秒);

- 次数:显示报告的次数。

**实例**

用`iostat -x /dev/sda1`来观看磁盘I/O的详细情况:

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/iostat-x.png)

详细说明:第一行是系统信息和监测时间,第二行和第三行显示CPU使用情况(具体内容和mpstat命令相同)。这里主要关注后面I/O输出的信息,如下所示:

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/iostat_explain.png)

**重点讲解**

r/s, w/s, rkB/s, wkB/s这几个参数,它们表示每秒读写次数和每秒读写数据量(千字节)。如果读写量过大,可能会引起性能问题。

await:IO操作的平均等待时间,单位是毫秒。这是应用程序在和磁盘交互时,需要消耗的时间,包括IO等待和实际操作的耗时。如果这个数值过大,可能是硬件设备遇到了瓶颈或者出现故障。

avgqu-sz:向设备发出的请求平均数量。如果这个数值大于1,可能是硬件设备已经饱和(部分前端硬件设备支持并行写入)。

%util:设备利用率。这个数值表示设备的繁忙程度,经验值是如果超过60,可能会影响IO性能(可以参照IO操作平均等待时间)。如果到达100%,说明硬件设备已经饱和。

如果显示的是逻辑设备的数据,那么设备利用率不代表后端实际的硬件设备已经饱和。值得注意的是,即使IO性能不理想,也不一定意味这应用程序性能会不好,可以利用诸如预读取、写缓存等策略提升应用性能。

# 七、free ———— 查看系统内存

> 作用:显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区。

**语法**

> free(选项)

> -b:以Byte为单位显示内存使用情况;

> -k:以KB为单位显示内存使用情况;

> -m:以MB为单位显示内存使用情况;

> -o:不显示缓冲区调节列;

> -s<间隔秒数>:持续观察内存使用状况;

> -t:显示内存总和列;

> -V:显示版本信息。

**实例**

![image](https://raw.githubusercontent.com/SurvivalBoy/imageGallery/master/Linux/free-m.png)

**第一部分Mem行解释:**

> total:内存总数;

> used:已经使用的内存数;

> free:空闲的内存数;

> shared:当前已经废弃不用;

> buffers Buffer:缓存内存数;

> cached Page:缓存内存数。

关系:total = used + free

**第二部分(-/+ buffers/cache)解释:**

> (-buffers/cache) used内存数:第一部分Mem行中的 used – buffers – cached

> (+buffers/cache) free内存数: 第一部分Mem行中的 free + buffers + cached

**解析**

> 需要注意的是:

>

> 第二行-/+ buffers/cache,看上去缓存占用了大量内存空间。

>

> 这是Linux系统的内存使用策略,尽可能的利用内存,如果应用程序需要内存,这部分内存会立即被回收并分配给应用程序。因此,这部分内存一般也被当成是可用内存。

>

> 如果可用内存非常少,系统可能会动用交换区(如果配置了的话),这样会增加IO开销(可以在iostat命令中体现),降低系统性能。

# 八、[sar](http://linux.51yip.com/search/sar) ———— 查看网络设备的吞吐率

> 作用:最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。

**语法**

> sar(选项)(参数)

**选项**

> -A:显示所有的报告信息;

> -b:显示I/O速率;

> -B:显示换页状态;

> -c:显示进程创建活动;

> -d:显示每个块设备的状态;

> -e:设置显示报告的结束时间;

> -f:从指定文件提取报告;

> -i:设状态信息刷新的间隔时间;

> -P:报告每个CPU的状态;

> -R:显示内存状态;

> -u:显示CPU利用率;

> -v:显示索引节点,文件和其他内核表的状态;

> -w:显示交换分区状态;

> -x:显示给定进程的状态。

**参数**

- 间隔时间:每次报告的间隔时间(秒);

- 次数:显示报告的次数。

**实例**

察看内存和交换空间的使用率:

```

sar -r

Linux 2.4.20-8 (www.linuxde.net) 20130503

12:00:01 AM kbmemfree kbmemused %memused

kbmemshrd kbbuffers kbcached

12:10:00 AM 240468 1048252 81.34

0 133724 485772

12:20:00 AM 240508 1048212 81.34

0 134172 485600

08:40:00 PM 934132 354588 27.51

0 26080 185364

Average: 324346 964374 74.83

0 96072 467559

```

kbmemfree与kbmemused字段分别显示内存的未使用与已使用空间,后面跟着的是已使用空间的百分比(%memused字段)。kbbuffers与kbcached字段分别显示缓冲区与系统全域的数据存取量,单位为KB。

观察系统部件10分钟,并对数据进行排序:

> sar -o temp 60 10

**通常作用**

sar命令在这里可以查看网络设备的吞吐率。在排查性能问题时,可以通过网络设备的吞吐量,判断网络设备是否已经饱和。

sar命令常用于查看TCP连接状态,其中包括:

active/s:每秒本地发起的TCP连接数,既通过connect调用创建的TCP连接;

passive/s:每秒远程发起的TCP连接数,即通过accept调用创建的TCP连接;

retrans/s:每秒TCP重传数量;

TCP连接数可以用来判断性能问题是否由于建立了过多的连接,进一步可以判断是主动发起的连接,还是被动接受的连接。

TCP重传可能是因为网络环境恶劣,或者服务器压力过大导致丢包。

# 九、[top](http://linux.51yip.com/search/top) ———— 动态地查看系统的整体运行情况

> 作用:可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。

**语法**

> top(选项)

**选项**

> -b:以批处理模式操作;

> -c:显示完整的治命令;

> -d:屏幕刷新间隔时间;

> -I:忽略失效过程;

> -s:保密模式;

> -S:累积模式;

> -i<时间>:设置间隔时间;

> -u<用户名>:指定用户名;

> -p<进程号>:指定进程;

> -n<次数>:循环显示的次数。

**top交互命令**

在top命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了-s选项, 其中一些命令可能会被屏蔽。

> h:显示帮助画面,给出一些简短的命令总结说明;

> k:终止一个进程;

> i:忽略闲置和僵死进程,这是一个开关式命令;

> q:退出程序;

> r:重新安排一个进程的优先级别;

> S:切换到累计模式;

> s:改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;

> f或者F:从当前显示中添加或者删除项目;

> o或者O:改变显示项目的顺序;

> l:切换显示平均负载和启动时间信息;

> m:切换显示内存信息;

> t:切换显示进程和CPU状态信息;

> c:切换显示命令名称和完整命令行;

> M:根据驻留内存大小进行排序;

> :根据CPU使用百分比大小进行排序;

> T:根据时间/累计时间进行排序;

> w:将当前设置写入~/.toprc文件中。

**实例**

> [root@localhost ~]# top

> top - 09:44:56 up 16 days, 21:23, 1 user, load average: 9.59, 4.75, 1.92

> Tasks: 145 total, 2 running, 143 sleeping, 0 stopped, 0 zombie

> Cpu(s): 99.8%us, 0.1%sy, 0.0%ni, 0.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

> Mem: 4147888k total, 2493092k used, 1654796k free, 158188k buffers

> Swap: 5144568k total, 56k used, 5144512k free, 2013180k cached

**解释**

```

top - 09:44:56 [当前系统时间],

16 days [系统已经运行了16天],

1 user [个用户当前登录],

load average: 9.59, 4.75, 1.92 [系统负载,即任务队列的平均长度]

Tasks: 145 total [总进程数],

2 running [正在运行的进程数],

143 sleeping [睡眠的进程数],

0 stopped [停止的进程数],

0 zombie [冻结进程数],

Cpu(s): 99.8%us [用户空间占用CPU百分比],

0.1%sy [内核空间占用CPU百分比],

0.0%ni [用户进程空间内改变过优先级的进程占用CPU百分比],

0.2%id [空闲CPU百分比], 0.0%wa[等待输入输出的CPU时间百分比],

0.0%hi[],

0.0%st[],

Mem: 4147888k total [物理内存总量],

2493092k used [使用的物理内存总量],

1654796k free [空闲内存总量],

158188k buffers [用作内核缓存的内存量]

Swap: 5144568k total [交换区总量],

56k used [使用的交换区总量],

5144512k free [空闲交换区总量],

2013180k cached [缓冲的交换区总量],

```

**通常作用**

top命令包含了前面好几个命令的检查的内容。比如系统负载情况(uptime)、系统内存使用情况(free)、系统CPU使用情况(vmstat)等。

因此通过这个命令,可以相对全面的查看系统负载的来源。同时,top命令支持排序,可以按照不同的列排序,方便查找出诸如内存占用最多的进程、CPU占用率最高的进程等。

但是,top命令相对于前面一些命令,输出是一个瞬间值,如果不持续盯着,可能会错过一些线索。这时可能需要暂停top命令刷新,来记录和比对数据。