Linux系统排查—内存篇

常见工作中,计算机系统的资源主要包括CPU,内存,硬盘以及网络,过度使用这些资源将使系统陷入困境。本系列一共四篇博文,结合我在实习期间的学习,介绍一些常见的Linux系统排障工具及方法。

第1篇—内存篇

第2篇—CPU篇

第4篇—网络篇

事实上,当上述服务器系统资源中的任何一个遭遇瓶颈,都会带来服务器性能的下降,典型的症状就是系统运行迟缓。

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

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

2. 内存用在哪里了

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

1. 内存硬件查看

# 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命令用来查看系统内存的整体使用情况。

# free -m

total used free shared buffers cached

Mem: 11972 6345 5627 1 305 2140

-/+ buffers/cache: 3899 8073

Swap: 856 0 856

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

# free -h

total used free shared buffers cached

Mem: 11G 6.2G 5.5G 1.2M 305M 2.1G

-/+ buffers/cache: 3.8G 7.9G

Swap: 856M 0B 856M

可以看到系统内存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命令用来查看具体进程消耗的内存空间。

# top

top - 14:45:43 up 35 days, 2:54, 2 users, load average: 0.35, 0.23, 0.21

Tasks: 213 total, 3 running, 210 sleeping, 0 stopped, 0 zombie

%Cpu(s): 2.1 us, 2.2 sy, 0.0 ni, 95.3 id, 0.3 wa, 0.0 hi, 0.1 si, 0.0 st

KiB Mem: 12260128 total, 6502480 used, 5757648 free, 312864 buffers

KiB Swap: 877564 total, 0 used, 877564 free. 2192620 cached Mem

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

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

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

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

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

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

1049 root 20 0 1167484 25124 15664 S 0.0 0.1 0:18.43 snapd

1409 root 20 0 135968 22912 17672 S 0.0 0.1 0:00.00 Xorg

1041 root 20 0 462932 16480 14308 S 0.0 0.1 0:00.14 NetworkManager

29225 colord 20 0 320912 12532 9648 S 0.0 0.0 0:00.09 colord

1272 whoopsie 20 0 284752 11488 9984 S 0.0 0.0 0:00.03 whoopsie

30649 root 20 0 274828 9888 8580 S 0.0 0.0 0:00.01 cups-browsed

1327 xrdp 20 0 103632 9456 2584 S 0.0 0.0 0:00.22 xrdp

925 root 20 0 298732 8752 7712 S 0.0 0.0 0:02.30 accounts-daemon

387 root 20 0 43880 8428 5996 S 0.0 0.0 0:00.73 systemd-journal

1138 root 20 0 292632 8196 7328 S 0.0 0.0 0:00.05 polkitd

1404 root 20 0 292164 8104 7216 S 0.0 0.0 0:00.04 lightdm

30648 root 20 0 100300 7820 6636 S 0.0 0.0 0:00.01 cupsd

31088 root 20 0 94924 6836 5896 S 0.0 0.0 0:00.02 sshd

1270 root 20 0 65508 6200 5488 S 0.0 0.0 0:00.00 sshd

1 root 20 0 185376 5964 4020 S 0.0 0.0 0:04.09 systemd

30655 lp 20 0 81244 5724 4956 S 0.0 0.0 0:00.00 dbus

31160 netc 20 0 30004 5684 3540 S 0.0 0.0 0:00.09 bash

406 root 20 0 46384 5352 3088 S 0.0 0.0 0:00.66 systemd-udevd

31090 netc 20 0 45276 4564 3860 S 0.0 0.0 0:00.02 systemd

31159 netc 20 0 94924 4284 3320 S 0.0 0.0 0:00.25 sshd

971 message+ 20 0 43180 4056 3484 S 0.0 0.0 0:00.65 dbus-daemon

31539 netc 20 0 49028 3856 3144 R 0.3 0.0 0:00.15 top

1329 root 20 0 137948 3724 2968 S 0.0 0.0 0:00.02 xrdp-sesman

932 syslog 20 0 256392 3344 2760 S 0.0 0.0 0:00.18 rsyslogd

1044 avahi 20 0 44912 3148 2828 S 0.0 0.0 0:03.76 avahi-daemon

927 root 20 0 28620 3132 2816 S 0.0 0.0 0:00.30 systemd-logind

1042 root 20 0 36076 2956 2680 S 0.0 0.0 0:00.18 cron

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

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

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

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

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

4. 交换空间

# swapon

# swapoff

# mkswap

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

例如:关闭交换分区

# swapoff -a

# free

total used free shared buffers cached

Mem: 12260128 6497332 5762796 1256 312980 2191960

-/+ buffers/cache: 3992392 8267736

Swap: 0 0 0

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

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

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

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

5. 内核态内存占用

# slabtop

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

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

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

Active / Total Objects (% used) : 1222616 / 1575898 (77.6%)

Active / Total Slabs (% used) : 39945 / 39945 (100.0%)

Active / Total Caches (% used) : 67 / 125 (53.6%)

Active / Total Size (% used) : 276332.00K / 318115.77K (86.9%)

Minimum / Average / Maximum Object : 0.01K / 0.20K / 15.75K

OBJS ACTIVE USE OBJ SIZE SLABS OBJ/SLAB CACHE SIZE NAME

516003 60% 0.10K 21749 39 86996K buffer_head

266158 99% 0.19K 6343 42 50744K dentry

73560 97% 0.63K 3012 25 48192K proc_inode_cache

70224 100% 0.96K 2128 33 68096K ext4_inode_cache

56489 99% 0.06K 890 64 3560K kmalloc-64

50791 96% 0.04K 515 102 2060K ext4_extent_status

29066 94% 0.19K 731 42 5848K kmalloc-192

22278 82% 0.55K 967 28 15472K radix_tree_node

26532 100% 0.11K 737 36 2948K sysfs_dir_cache

20910 100% 0.05K 246 85 984K shared_policy_node

12712 100% 0.57K 454 28 7264K inode_cache

10815 93% 0.07K 206 56 824K anon_vma

7840 86% 0.03K 71 128 284K kmalloc-32

3567 52% 0.25K 211 32 1688K kmalloc-256

6656 100% 0.02K 26 256 104K kmalloc-16

4747 72% 0.12K 205 32 820K kmalloc-128

6656 100% 0.02K 26 256 104K kmalloc-16

通常关注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命令可以查看内存使用的动态变化,

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

# vmstat 1

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----

r b swpd free buff cache si so bi bo in cs us sy id wa st

0 0 5755120 312980 2192136 0 0 1 33 1 0 5 2 92 1 0

0 0 5755120 312980 2192136 0 0 0 8 2000 2770 1 2 97 0 0

0 0 5755120 312980 2192136 0 0 0 24 2033 2715 1 2 96 1 0

0 0 5755120 312980 2192136 0 0 0 0 1999 2317 1 2 98 0 0

1 0 5754996 312980 2192136 0 0 0 4 2187 3004 6 3 91 0 0

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

7. dstat

netc@gpu:~$ dstat

You did not select any stats, using -cdngy by default.

----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--

usr sys idl wai hiq siq| read writ| recv send| in out | int csw

0 0 100 0 0 0|5463B 7415B| 0 0 | 0 0 | 27 34

0 0 100 0 0 0| 0 0 | 60B 826B| 0 0 | 18 27

0 0 100 0 0 0| 0 0 |3592B 346B| 0 0 | 101 108

0 0 100 0 0 0| 0 0 | 860B 346B| 0 0 | 35 30

0 0 100 0 0 0| 0 0 | 704B 346B| 0 0 | 27 26

0 0 100 0 0 0| 0 0 | 120B 388B| 0 0 | 14 18

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 58 66

0 0 100 0 0 0| 0 0 | 284B 346B| 0 0 | 19 22

0 0 100 0 0 0| 0 0 | 152B 346B| 0 0 | 15 18

0 0 100 0 0 0| 0 0 | 152B 346B| 0 0 | 24 30

0 0 100 0 0 0| 0 0 | 152B 346B| 0 0 | 19 24

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 51 54

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 14 18

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 13 16

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 11 18

0 0 100 0 0 0| 0 56k| 60B 346B| 0 0 | 60 62

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 12 16

0 0 100 0 0 0| 0 0 | 390B 346B| 0 0 | 20 26

0 0 100 0 0 0| 0 0 | 60B 346B| 0 0 | 11 18

8. 查看共享内存空间

pmap

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

# pmap -d 1

1: /sbin/init

Address Kbytes Mode Offset Device Mapping

00007fb45d59c000 44 r-x-- 0000000000000000 008:00002 libnss_files-2.19.so

00007fb45d5a7000 2044 ----- 000000000000b000 008:00002 libnss_files-2.19.so

00007fb45d7a6000 4 r---- 000000000000a000 008:00002 libnss_files-2.19.so

00007fb45d7a7000 4 rw--- 000000000000b000 008:00002 libnss_files-2.19.so

00007fb45d7a8000 44 r-x-- 0000000000000000 008:00002 libnss_nis-2.19.so

00007fb45d7b3000 2044 ----- 000000000000b000 008:00002 libnss_nis-2.19.so

00007fb45d9b2000 4 r---- 000000000000a000 008:00002 libnss_nis-2.19.so

00007fb45d9b3000 4 rw--- 000000000000b000 008:00002 libnss_nis-2.19.so

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

# sar

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

如何清理内存使用

9.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

9.2 终止进程

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

/proc/meminfo

内存信息

/proc/$pid/status

进程状态信息,

/proc/$pid/statm

进程物理内存信息

/proc/slabinfo

slab的分布状况

/proc/vmstat

虚拟内存信息

10 一些额外的小技巧

10.1 降低swap的使用率:

# sysctl -a | grep swappiness

vm.swappiness = 60

可以查看当前swap的使用

10.2 限制其他用户的内存使用

# vim /etc/security/limits.conf

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

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

10.3 大量连续内存数据:

# vim /etc/sysctl.conf

vm.nr_hugepage=20

10.4 调节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)。

10.5 脏页

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往硬盘上面刷。

END

占用内存最小linux,Linux系统排查1—内存篇相关推荐

  1. Linux清除系统缓存释放内存命令介绍

    1. drop_caches 在Documentation/sysctl/vm.txt中有如下描述: drop_caches:Writing to this will cause the kernel ...

  2. 32位linux系统支持多大内存吗,linux32位操作系统支持大内存

    32bit的linux操作系统最大支持的内存为4GB,如何让其支持更大的内存呢? 我们需要将操作系统安装kennel-PAE内核包,让系统支持PAE物理地址拓展,下载地址:http://pan.bai ...

  3. Linux调度系统全景指南(终结篇)

    点击上方蓝字关注公众号,更多经典内容等着你 | 导语本文主要是讲Linux的调度系统, 本篇是终结篇,主要讲当前多核系统调度策略和调度优化,调度可以说是操作系统的灵魂,为了让CPU资源利用最大化,Li ...

  4. android内存检测方法,Android_Android系统检测程序内存占用各种方法,1.检查系统总内存 复制代码 - phpStudy...

    Android系统检测程序内存占用各种方法 1.检查系统总内存 liuhx@uc ~ $ adb shell cat /proc/meminfo MemTotal:         840868 kB ...

  5. Linux CentOS 系统实战笔记-基础篇

    CentOS 日常笔记 1.Linux基础命令1 2.Linux基础命令2 3.输入输出重定向 4.Linux下目录分类与作用 5.虚拟机与物理机时间同步 6. VIM 神之编辑器 7. Linux ...

  6. virtualbox 该内存不能为written_系统提示“该内存不能为read”的原因和解决办法...

    我们单位的电脑经常显示这个对话框,已经有好几年了,单位的老头们都不怎么懂电脑,我本人也不爱管闲事. 但是出现这种对话框的原因是什么呢?又怎么解决呢? 一般电脑经常出现蓝屏和死机,而且频繁出现. 有时会 ...

  7. widnows监控linux 内存,Linux_带你全面了解Linux系统内存监控,在Windows系统中查看内存的使用 - phpStudy...

    带你全面了解Linux系统内存监控 在Windows系统中查看内存的使用情况很简单,想必大家都已经耳熟能详了,那么在Linux系统如何查看内存使用情况呢?下面和大家分享在Linux系统下查看内存使用情 ...

  8. linux物理内存虚拟内存一致,Liunx内存管理的调用和实现

    下面我们探讨一下关于内存管理的系统调用方式.事实上,POSIX 并没有给内存管理指定任何的系统调用.然而,Linux 却有自己的内存系统调用,主要系统调用如下 系统调用描述s = brk(addr)改 ...

  9. linux 内存管理_真香!Linux 原来是这么管理内存的

    这是 Linux 系列第三篇文章,前两篇文章如下 程序员cxuan:初识 Linux 系统,就这一篇了!​zhuanlan.zhihu.com 程序员cxuan:Linux 进程必知必会​zhuanl ...

  10. 真香!Linux 原来是这么管理内存的

    Linux 内存管理模型非常直接明了,因为 Linux 的这种机制使其具有可移植性并且能够在内存管理单元相差不大的机器下实现 Linux,下面我们就来认识一下 Linux 内存管理是如何实现的. 基本 ...

最新文章

  1. llinux基本操作
  2. 为什么你喜欢的女生不喜欢你
  3. 【Java多线程编程】选号程序
  4. jzoj1768,P2704,POJ1185-[NOI2001]炮兵阵地【状态压缩dp】
  5. 【剑指offer】面试题31:栈的压入、弹出序列(Java)
  6. c#统计字符串中数字字符的个数【C#】
  7. 学习有五个层次和境界
  8. 「10」民主投票法——KNN的秘密
  9. 20160504课堂作业
  10. nvidia显卡cuda的性能_苦等10年!512 CUDA满血GTX 480终于出现:性能提升6%、功耗暴增43%...
  11. 11.8 scrum report
  12. NDK编译时指定NDK_MODULE_PATH的方法
  13. Java判断质数(素数)
  14. 关于另类BT下载的想法
  15. 【C语言】学习gotoxy() 与 clrscr() 函数
  16. 印象笔记导入html笔记,Evernote Importer|印象笔记导入
  17. 【Google Play】Google Play 签名维护 ( 签名机制 | Google Play 签名机制选择 | 签名更新 )
  18. vasp 模拟退火_【转】vasp的分子动力学模拟 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  19. 2020北京国际茶业展 | 共赴茶香之约,凤牌红茶与您共品好茶
  20. SCI科研论文配图插图绘制推荐-博图汇科研绘图

热门文章

  1. 微信开发 完美微信自动转发朋友圈-flutterAndroid
  2. 音频,视频合并软件——ffmpeg下载及使用
  3. echarts:中国地图-省市区二级联动
  4. java向led屏下发字符串乱码_几种误解,以及乱码产生的原因和解决办法
  5. 内蒙古自治区及其盟市行政单位中英文名称对照表
  6. Git三大特色之Stage(暂存区)--留着当资料
  7. 09.大数据技术之Spark
  8. 卡诺模型案例分析_KANO模型案例分析---来自58学车
  9. kd树(K-dimensional tree)
  10. 语音视频自动生成字幕功能介绍