linux查看日志gror,Linux系统排查1——内存篇

本文从以下几个角度介绍Linux系统内存相关的排查。

1. 内存的使用率如何查看,使用率真的很高吗

2. 内存用在哪里了

3. 内存优化可以有哪些手段

内存硬件查看

dmidecode -t memory

# dmideocde -t memory

//以下为命令输出节选

# dmidecode 2.12

# SMBIOS entry point at 0x7f6be000

SMBIOS 2.5 present.

Handle 0x0005, DMI type 16, 15 bytes

Physical Memory Array

Location: System Board Or Motherboard

Use: System Memory

Error Correction Type: Single-bit ECC

Maximum Capacity: 192 GB

Error Information Handle: Not Provided

Number Of Devices: 18

Handle 0x0010, DMI type 6, 12 bytes

Memory Module Information

Socket Designation: DIMM06

Bank Connections: 0 0

Current Speed: 1 ns

Type: DIMM

Installed Size: 8192 MB (Single-bank Connection)

Enabled Size: 8192 MB (Single-bank Connection)

Error Status: OK

Handle 0x0011, DMI type 17, 27 bytes

Memory Device

Array Handle: 0x0005

Error Information Handle: Not Provided

Total Width: 72 bits

Data Width: 64 bits

Size: 8192 MB

Form Factor: DIMM

Set: None

Locator: DIMM06

Bank Locator: BANK06

Type: Other

Type Detail: Unknown

Speed: 800 MHz

Manufacturer: Hynix

Serial Number: 5781322C

Asset Tag: Unknown

Part Number: HMT31GR7BFR4C-H9

通过dmidecode工具可以查看很多硬件相关的数据,这里仅以内存为例。我们可以看到,服务器最大支持内存扩充为192GB,目前已经安装了一块海力士(Hynix)生产的8GB内存,该内存插在主板的第六个DIMM插槽上面(物理插槽又称socket)。

该命令能够给出物理内存的许多详细信息,本文并不一一介绍。

2. 内存的大体使用情况

free -m/-h

free命令用来查看系统内存的整体使用情况。

06262cbdb5a4

free -m以MB为单位显示整个系统的内存使用情况,free -h则自动选择以适合理解的容量单位显示:

06262cbdb5a4

可以看到系统内存12GB(总可用11.7GB),当前已用6.2G,剩余5.5GB。这个例子中我们看到系统的内存使用并不高,但即便free命令显示的"used"的值很高,接近total的值,那么系统就真的没有内存空间了吗?

我们可以看到free 命令下面有一行“-/+ buffers/cache”,该行显示的used是上一行“used”的值减去buffers和cached的值,同时该行的free是上一行的free加上buffers和cached的值。这里可以看到,尽管第一行的used显示共使用了6.2GB的物理内存,但除去buffers和cached数据后,实际仅仅占用了3.8GB的内存,而如果剩余空间加上buffers和cached数据当前占用的内存,将达到8BG之多。

这是因为buffers和cache数据是动态变化的,内存充足时,内核出于性能考虑会进行一定的缓存,当内存空间不足时,buffers, cached占用的空间是可以为了程序释放的。

因此判断系统内存是否耗竭的实际指标是看减去buffer和cache的空间后used空间是否依旧很大,以及交换空间是否被大量占用。显然这个例子不符合内存耗竭的情形。

那么buffers与cached又有什么区别呢?

(1) buffers:记录文件系统的metadata,例如目录里面有什么内容,权限等等;

(2) cached:用来给文件做缓冲,缓存刚刚访问的文件。

3. 哪些进程消耗内存比较多?

top

06262cbdb5a4

top 命令查看系统的实时负载, 包括进程、CPU负载、内存使用等等;

进入top的实时界面后,默认按照CPU的使用率排序,通过“shift+m”按键将进程按照内存使用情况排序,可以查看哪些进程是当前系统中的内存开销“大户”。

top命令中,按下 f 键,进入选择排序列的界面,这里可以选择要显示的信息列,要按照哪些信息列进行排序等,该界面上有简要的介绍,这里不再赘述。

可以看到top命令也会显示系统整体的内存使用情况,同样包括了total, used, free, buffers, cached等,需要注意的是,这里并没有像free命令那样提供-/+ buffers/cached之后的值,因此需要经过额外计算才能获得当前系统实际剩余的可用内存。

另一方面,我们查看不同进程的内存开销,

06262cbdb5a4

通过%MEM列,可以查看哪几个进程占用了大量的内存,在缓解内存不足的紧急情况时,可以终止这些占用内存较多的进程。

top命令中有以下与内存相关的数据列:

(1)VIRT:虚拟内存,是进程申请的虚拟内存总量;

(2)RES: 常驻内存,是进程切实使用的物理内存量,free命令中看到的used列下面的值,就包括常驻内存的加总,但不是虚拟内存的加总;

(3)SHR:共享内存,比如共享库占用的内存等。

4. 交换空间

swapon

swapoff

mkswap

使用free命令可以查看内存的总体使用,显示的内容也包括交换分区的大小,可以使用swapon,swapoff,命令开启或关闭交换空间,交换空间是磁盘上的文件,并不是真正的内存空间。

例如:关闭交换分区

06262cbdb5a4

此时交换分区显示全为0,说明系统没有开启交换分区。swapon命令可以启用交换分区。

当内存不足时,系统会选择通过:1.将部分不常被访问的内存页交换到内存空间,或2.删除部分cache的文件来释放内存空间。

系统的可用内存一般等于物理内存 + 交换分区。交换分区在磁盘上, 因此速度比内存读写要慢得多。

交换分区实际上就是磁盘上的文件,可以通过mkswap命令来创建交换空间。

5. 内核态内存占用

slabtop

slab系统用来处理系统中比较小的元数据,如文件描述符等,进而组织内核态的内存分配。

一个slab包含多个object,例如dentry这些数据结构就是object,可以通过slabtop命令查看系统中活动的object的数量与内存占用情况,从而了解哪些数据结构最占用内核态的内存空间。

例如:使用slabtop命令查看内核数据结构及内存占用

06262cbdb5a4

通常关注1. 哪些数据结构的内存占用最大,2. 哪些类型的数据结构对应的object最多,比如inode多代表文件系统被大量引用等。

该交互命令支持的选项与排序标准有:

选项:

--delay=n, -d n 每隔n秒刷新信息

--once, -o 只显示一次

--sort=S, -s S 按照S排序,其中S为排序标准

排序标准(shift + 对应的键):

a:根据active objects数量高低排序

b:根据 objects / slab高低来排序

c:根据cache大小排序

l:根据slab数量排序

v:根据active slabs数量排序

n:按 name 排序

o:按照 objects 数量排序

p:按照 pages / slab 的值排序

s:按照 object 大小排序

u:按照 cache 使用量排序

6. 查看内存使用的动态变化

vmstat命令可以查看内存使用的动态变化,

例如: 使用vmstat动态监视内存变动

06262cbdb5a4

其中# vmstat N 代表每隔N秒更新一次数据。

7. dstat

06262cbdb5a4

8. 查看共享内存空间

pmap

可以使用pmap命令查看进程使用的共享内存,包括使用的库,所在堆栈空间等。

06262cbdb5a4

9. 查看系统内存历史记录

sar

可以使用sar命令查看一个月以内的内存使用情况。

如何清理内存使用

1. 释放占用的缓存空间

# sync //先将内存刷出,避免数据丢失

# echo 1 > /proc/sys/vm/drop_caches //释放pagecache

# echo 2 > /proc/sys/vm/drop_caches //释放dentry和inode

# echo 3 > /proc/sys/vm/drop_caches //释放pagecache、dentry和inode

终止进程

与Linux内存相关的文件系统文件

/proc/meminfo

内存信息

/proc/$pid/status

进程状态信息,

/proc/$pid/statm

进程物理内存信息

/proc/slabinfo

slab的分布状况

/proc/vmstat

虚拟内存信息

一些额外的小技巧

降低swap的使用率:

# sysctl -a | grep swappiness

vm.swappiness = 60

可以查看当前swap的使用

限制其他用户的内存使用

# vim /etc/security/limits.conf

user1 hard as 1000 (用户user1所有累加起来,内存不超过1000kiB)

user1 soft as 800 (用户user1一次运行,内存不超过800kiB)

大量连续内存数据:

# vim /etc/sysctl.conf

vm.nr_hugepage=20

调节page cache(大量一样的请求 调大page cache)

vm.lowmem_reserve_ratio = 256 256 32 (保留多少内存作为pagecache 当前 最大 最小)

vm.vfs_cache_pressure=100 (大于100,回收pagecache)

vm.page.cluster=3(一次性从swap写入内存的量为2的3次方页)

vm.zone_reclaim_mode=0/1(当内存危机时,是否尽量回收内存 0:尽量回收 1:尽量不回收)

min_free_kbytes:该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。

脏页

vm.dirty_background_radio=10 (当脏页占内存10%,pdflush工作)

vm.dirty_radio=40 (当进程自身脏页占内存40%,进程自己处理脏页,将其写入磁盘)

vm.dirty_expire_centisecs=3000 (脏页老化时间为30秒 3000/100=30秒)

vm.dirty_writeback_centisecs=500 (每隔5秒,pdflush监控一次内存数量 500/100=5秒)

脏页是指已经更改但尚未刷到硬盘的内存页,由pdflush往硬盘上面刷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值