free
在Linux系统监控的工具中,free命令也是最经常使用的命令之一。free
命令显示系统的内存情况,包括物理内存、swap区内存和内核缓冲区内存。共享内存将被忽略。
虚拟内存和swap区
首先需要明确的是虚拟内存的概念,虚拟内存是一种逻辑上的映射关系 。虚拟内存的作用是通过操作系统的调度,使得进程在调用使用内存时需要通过虚拟内存地址找到对应的物理内存地址,解决多进程之间地址冲突的问题。
swap分区也称为交换分区 、交换空间 ,理论上是Linux系统解决内存碎片的方案。操作系统将碎片化的内存占用装载到外部磁盘上,从而在内存中空出完整的内存地址,提高可用的内存空间。当程序过大而物理内存不足时,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,可以把它换出到物理内存之外,就是硬盘上的 swap 区域。因为磁盘的访问速度比内存要低很多,所以内存交换的时候,会产生明显的性能瓶颈。
共享内存
共享内存是 Unix下的多进程之间的通信方法 ,这种方法通常用于一个程序的多进程间通信,实际上多个程序间也可以通过共享内存来传递信息。
共享内存允许两个或更多进程访问同一块内存,是进程间共享数据的一种最快的方法,要注意的是多个进程之间对一个给定存储区访问的互斥。若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这些数据。
buffer和cache
首先需要明确的是buffer和cache都位于内存中,都是临时存储,都是为了提高I/O速度,但是他们有不同的用途。
Buffer是即将写入磁盘的数据的临时存储,可称为缓冲 。内核将分散的写入集中起来,从而对磁盘写入进行统一优化。通俗来说,就是将多个小的写入合并为一个大的写入。
Cache是从磁盘读取到的数据的临时存储,可称为缓存 。用于缓存从文件中读取的数据,这样,下次访问这些文件数据时,可以直接从内存中快速取回,而无需再次访问缓慢的磁盘。
top命令输出结果
1 2 3 4 5 6 7 8 9 10 11 12 [root@dengpangpang ~]$ free -m total used free shared buff/cache available Mem: 1837 362 154 21 1321 1254 Swap: 0 0 0
iotop
iotop
命令是一个用来监视磁盘I/O使用状况的top类工具,跟top
命令有着相同的UI和显示方式,可以查看每个进程的I/O信息。
1 2 3 4 5 6 7 8 [root@dengpangpang ~]$ iotop Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % systemd --switched-root --system --deserialize 22 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 5 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0H]
选项
-p
:显示指定进程pid的信息
-u
:显示指定用户的信息
交互命令
左右箭头:改变排序方式,默认是I/O
o
:只显示有I/O的进程
p
:切换进程/线程显示方式
a
:显示累计使用量
q
:退出
vmstat
vmstat
命令也是常见的Linux监控工具,可以展现服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。
vmstat
命令的使用也比较简单,可使用两个数字参数,第一个参数是采样的时间间隔数(秒),第二个参数是采样的次数。默认采集一次。
1 2 3 4 [root@dengpangpang ~]$ vmstat procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 156348 221260 1134576 0 0 0 3 3 5 1 1 98 0 0
信息解释
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 r: 表示运行队列,即多少个进程分配到CPU,当这个值超过CPU数目,就会出现CPU瓶颈了。 b: 表示阻塞的进程。 swpd: 交换内存已使用的大小,如果数量频繁变动,表示设备物理内存不足。 free: 空闲的物理内存的大小。 buff: 缓冲 cache: 缓存 si: 每秒从磁盘读入交换内存的大小,swap in so: 每秒交换内存写入磁盘的大小,swap out bi: 块设备每秒接收的块数量,block in bo: 块设备每秒发送的块数量,block out in : 每秒CPU的中断次数,包括时间中断cs: 每秒上下文切换次数,切换次数过多表示CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。 us: 用户态占用CPU时间 sy: 内核态占用CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。 id : 空闲CPU时间wt: 等待IO的CPU时间。
hcache
hcache
可以查看进程的缓存占用情况,以及占用操作系统缓存最多的文件。
缓存文件分类
在系统进程内存使用较大压力的情况下,会自动进行内存的回收。除此之外,我们也可以进行手动buffer/cache回收。
操作系统控制缓存释放的文件是/proc/sys/vm/drop_caches
,drop_caches
文件中的值可以是0-3之间的数字,代表不同的含义:
0
:不释放(系统默认值)
1
:释放Page cache,Page cache是针对文件系统的,是文件的缓存
2
:释放dentries和inodes缓存,dentries 表示目录的数据结构缓存, inodes 表示文件的数据结构缓存
3
:释放所有缓存
手动释放缓存的命令:
1 2 3 sync echo "3" > /proc/sys/vm/drop_caches sync
使用hcache
1 2 3 4 5 6 7 [root@dengpangpang tools]$ hcache -bname -pid 24917 +----------------------------------------------------------------+----------------+------------+-----------+---------+ | Name | Size (bytes) | Pages | Cached | Percent | |----------------------------------------------------------------+----------------+------------+-----------+---------| | _json.cpython-36m-x86_64-linux-gnu.so | 51584 | 13 | 13 | 100.000 | | _ssl.cpython-36m-x86_64-linux-gnu.so | 118560 | 29 | 29 | 100.000 | | libselinux.so.1 | 155744 | 39 | 39 | 100.000 |
使用说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache chmod 755 hcache ;mv hcache /usr/local/bin/-top 3 显示占用缓存大小最多的前3位的文件 -bname 不显示文件全路径,只显示文件名 -pid 指定进程号,查看进程相关的文件缓存 Name: 文件名 Size: 文件大小 Pages: 文件所占的页数,Pages × 单页大小 = Size Cached: 文件被缓存的页数 Percent: 文件被缓存的页数占文件总页数的百分比,Percent = Cached / Pages × 100%