Linux 内存及cpu解析

时间:2022-03-26 16:07:50

1、free :查看内存、swap

[root@admin home]# free
total used free shared buffers cached
Mem: 1922264 222580 1699684 204 28104 61788
-/+ buffers/cache: 132688 1789576
Swap: 4194300 0 4194300

注意:查看内存还剩多少空间时,只能看-/+ buffers/cache这行的数字,上行只能参考。
Linux的特性,将打开过的文件放到cached里边,所做过关于目录结果的操作会放到buffers里边,当再次需要这些数据时,就会很快给打开,这两会不停的占用内存,但是当内存不够时,这两部分空间会被瞬间被释放。

2、uptime : 查看load,启动多少时间,目前有多少个用户
这是cpu的性能查看命令。

[root@admin ~]# uptime
10:17:52 up 1 min, 2 users, load average: 0.12, 0.08, 0.03

各项数据解析:
10:17:52 : 系统几点启动的

up 1 min : 启动多少时间,当这个时间超过180天时,系统重启时会做文件系统检测,ext3有个特性,自检特别慢。

2 users :当前有多少用户在登录

load average: 0.12, 0.08, 0.03 : 平均负载 : 1分钟平均,5分钟平均,15分钟平均

load average中这三个数很重要,主要衡量cpu工作的情况。这些数值的安全值计算方法为:cpu总核数 * 0.7,当1分钟平均值 < 安全值时,说明这机器是健康的,运算能力能承载其任务量的。如果超过了,就很危险,而且会累计的,如果一直累计不释放的话,就会导致机器死机。

实例解析:
假如机器有 10 个核心,则安全值为 :10 * 0.7 = 7

  • 实例一:
    当load average三个数分别为:5,5,5,也就是说在1分钟,5分钟,15分钟平均值都是5,也就是说机器稳定在5个任务,但是我机器是10核的cpu,总是可以满足任务量的。这三个数要衡量着来看。

  • 实例二:
    当load average三个数分别为:15,10,5,1分钟,5分钟,15分钟平均值是15,10,5,这个时候说明1分钟平均值高于了15分钟的平均值,说明在1分钟内机器的要处理的任务量突然升高,可以看出这个机器时一个突发的cpu增高,此时我们应该做的不是立刻去kill掉一些进程,而是先观察1分钟的平均值,如果在下降为5,10,15,说明近期内机器的任务量下去了,或者是任务被处理掉了等,说明机器已经回到平稳阶段了。但是如果这个值在不停的增加,比如变成25,11,5,此时说明,机器确实存在问题了,在短期内有任务量剧增,这时就必须去查看是什么原因引起。

3、cat /proc/cpuinfo : 查看cpu的核数
文件/proc/cpuinfo里面存着cpu的很多基本信息,如核数。

4、vmstat :LInux/Unix监控工具
vmstat命令可以展现在给定时间间隔服务器的状态值,包括服务器的CPU使用率、内存使用情况、虚拟内存交互情况、IO读写情况等。

vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,但是我们一般用第一个参数就行。
Linux 内存及cpu解析

解析:
2表示每2秒采集一次,都是平均值,这里采集了4次就按ctrl + c停止了。其中第一行是开机到现在的平均值,下边是没2秒计算一次的平均值,这样就有一个对比。

下面是每个字段分别代表的意思:

(1)进程procs:
r : 代表运行队列中进程数量。基本上可以反应uptime中load average的值,基本上相等。当这个值超过CPU数目,就会出现CPU瓶颈了。

b : 等待磁盘IO的进程数量,也表示阻塞的进程数量。这个值反应的是后面的wa的情况,它两是联动的。通常情况下,该参数的值都是0,一般都在0,1,2..然后又回到0,这都是正常情况。如果这个数出现了长时间的累加,说明磁盘出问题了,系统即将崩溃,有可能IO写不进去了,所有的进程都在等待写。

r + b的值就是load average的值,也就是说r + b的值不能长时间超过CPU核数 * 0.7,尤其是CPU的核数。也可以是长时间不能超过 CPU核数 * 0.7 * n ,n表示的1颗cpu的线程数。

(2)Linux 内存监控内存memoy:
swpd :虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free = buff + cache,一般直接使用free命令查看

(3) Linux 内存监控swap交换页面
si : 每秒从交换区写到内存的大小。如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。

so : 每秒从内存写到交换区的大小。如果值大于0,同上。

(4)Linux 内存监控 io块设备:
bi : 对系统来说,每秒读取的块数(从磁盘读取)

bo : 对系统来说,每秒写入的块数(像磁盘写)。bi 和 bo的值的大小(一般都是接近0 的)会直接影响到b wa的值。

(5)Linux 内存监控system系统:
in : 每秒CPU的中断次数,包括时间中断。

cs : 每秒上下文切换次数,例如调用系统函数时,就要进行上下文切换,线程切换等,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。

(6)Linux 内存监控cpu*处理器:
us : 用户进程占用CPU的时间,是一个百分比。

sy : 系统进程占用CPU的执行时间,如系统内核,bash等。

id : CPU空闲时间,在LInux系统上这个值经常性要大于50%,机器才算正常。

wa : CPU等待IO所占时间的百分比。通常不能超过20%,如果长时间超过会因为等待IO,而造成大量的运算资源堆积,运算速度越来越慢,也就是说磁盘的读写速度跟不上你的机器的运算速度了,需要考虑提升磁盘的读写速度,最简单的就是换一块SSD盘(固态盘)。

5、pidstat :实时监控运行进程命令
pidstat主要用于监控全部或指定进程占用的系统资源的情况,如CPU,内存,设备IO,任务切换,线程等。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需要的统计信息。

6、ps :列出系统中当前运行的进程,相当于Windows的任务管理器
ps是显示瞬间行程的状态,并不动态连接,如果想对进程运行时间监控,应该用top工具,kill用于杀死进程。
使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。

Linux上进程的5种状态:

  1. 运行(正在运行或在运行对列中等待)
  2. 中断(休眠中,受阻,在等待某个条件的形成或接受信号)
  3. 不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生)
  4. 僵死(进程已终止,但进程描述符存在,直到父进程调用wait4()系统调用后释放)
  5. 停止(进程收到SIGSTOP,SIGSTP,SIGTIN,SIGTOU信号后停止运行)

ps工具标识进程的5中状态码:

  • D 不可中断 uninterruptible sleep (usually IO)
  • R 运行 runnable (on run queue)
  • S 中断 sleeping
  • T 停止 traced or stopped
  • Z 僵死 a defunct (”zombie”) process

命令参数:
a:显示所有进程
-a:显示同一终端下的所有进程
c:显示进程的真实名称
-e:显示所有进程
e:显示环境变量
f:显示程序间的关系
-u: 显示指定用户的所有进程
aux:显示所有包含其他使用者的行程
ps 常与 grep组合使用,查找特定的进程,如ps -ef | grep ssh

[root@admin ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 07:37 ? 00:00:01 /sbin/init
root 2 0 0 07:37 ? 00:00:00 [kthreadd]

相关信息的意义:

UID :程序被UID所拥有
PID :进程的ID
PPID :上级父进程的ID
C :占用CPU的百分比
STIME :启动时间,超过1年就变成年了,超过1天就变成日期了
TTY :登入者的终端机位置
TIME : 使用掉的CPU时间
CMD :进程的名称
[root@admin ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19364 1524 ? Ss 07:37 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 07:37 0:00 [kthreadd]

各项参数解析:
%CPU :占CPU的百分比

%MEM :占内存的百分比

VSZ :使用的虚拟内存量

RSS :进程占用实际的固定内存量

STAT :S:休眠的进程,sn :表示处于休眠的优先级较低的进程,Ss :表示有子进程,S < s :表示优先级比较高的进程,Z :代表僵死进程

7、top :实时监控Linux的系统状况
top是最重要的性能分析命令,是一个动态显示过程,实时对系统处理器的状态监视,将显示系统中CPU最敏感的任务列表。

[root@admin ~]# top
top - 09:42:39 up 2:04, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2%us, 0.0%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1922264k total, 217996k used, 1704268k free, 27864k buffers
Swap: 4194300k total, 0k used, 4194300k free, 61616k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12 root 20 0 0 0 0 S 0.3 0.0 0:03.25 events/1
1835 root 20 0 15032 1168 912 R 0.3 0.1 0:00.82 top

解释:
top命令跟ps很像。top第一行的数值跟uptime很像
Tasks: 89 total, 1 running, 88 sleeping, 0 stopped, 0 zombie表示有89个任务,1个在运行,88个在休眠,0个在后台运行,0个僵死进程,通过ctrl + z可以造出stopped进程,但最好不用这个,这个不是个好习惯。

PR :优先级

NI :负值表示低优先级,正直表示高优先级,大部分是0

VIRT : 虚拟内存

RES :实际使用的内存

SHR :share内存,共享内存,有可能被别的进程用到

调整显示的列方法:
在top运行界面按一下f 键,可以进入到需要显示列的选择界面,然后按最前面对应的字母键,就可以选中需要显示的列,然后按任意键,通常为空格,就可以回到top运行界面,可以看到刚选中需要显示的列的值。
调整显示的顺序方法:
在top运行界面,按 o 键,进入到显示先后顺序界面,如p字母,按小写的p就是像下移动,按shift + p,就是像上移动。
按照某个列排序显示调整方法:
按大写的F或O,进入到调整界面,同样按前面对应的字母然后再按任意键出去就ok了。
top是很耗资源的,当机器内存严重不足时,最好别用这个命令,有可能让机器彻底死机。

8、sar :系统性能分析工具
sar(System Activity Reporter系统活动情况报告)是目前Linux上最为全面的系统系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。
sar命令常用格式:

sar [options] [-A] [-o file] t [n]

参数说明:
t :采样间隔,默认为1
n :采样次数,默认为1
-o file 将命令结果以二进制格式存放到文件中,file是文件名。
options:命令行选项。常见命令如下:

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

9、kill :杀进程命令
格式:

kill [-s signal | -p ] [-a] pid ...
kill -l [signal ]

参数:
-s :指定发送的信号
-p :模拟发送的信号
-l :指定信号的名称列表
pid :要中止进程的ID号
signal :表示信

kill -9 :强制中止一个进程,但是只杀当前的进程,与当前相关的进程杀不掉,比如说如果杀了某个进程的父进程,那么其子进程就被留下了,怎么也杀不掉了,这时只能重启机器了。所以一般不用这个命令。