free命令
使用free可以获取到设备当前的内存
/tmp # free
total used free shared buffers cached
Mem: 2888012 1850132 1037880 0 18864 123656
-/+ buffers/cache: 1707612 1180400
Swap: 0 0 0
其中,各项表示的含义如下所示:
total: 总计物理内存大小。
used: 已使用内存大小。
free: 可使用内存大小。
shared: 多个进程共享的内存总额。
buffers/cached: 磁盘缓存大小。
单位都为KB。
对于系统而言,buffers和cached都是被使用的,所以可用内存为1037880KB。
对于应用程序而言,buffers和cached是可用的。当应用程序需要内存的时候,buffers和cached会被回收。从应用程序的角度而言,可用内存=free memory+buffers+cached。按上面的例子,即可用内存为1037880+18864+123656=1180400。
使用cat /proc/meminfo可以查看更详细的内存信息。
/proc下内存相关文件
/proc/iomem:查看物理设备在物理内存中的映射关系
/proc/slabinfo:内核对象的当前使用状态
/proc/vmstat:虚拟内存统计信息。可以使用vmstat - Report virtual memory statistics 打印虚拟内存状态。
tmpfs
/tmp # df -h
Filesystem Size Used Available Use% Mounted on
/dev/sda7 1.9G 914.6M 893.3M 51% /
tmpfs 1.4G 15.1M 1.4G 1% /tmp
none 1.4G 292.0K 1.4G 0% /tmp/shm
/dev/sda3 5.0G 282.1M 4.5G 6% /data
/dev/sda6 350.8M 62.4M 270.1M 19% /boot
/dev/sda5 114.2M 2.1M 106.0M 2% /bootloader
none 1.4G 292.0K 1.4G 0% /tmp/shm
tmpfs 512.0K 0 512.0K 0% /dev
……
如上所示,/tmp为内存文件系统,内存挂载为内存文件系统(tmpfs)。使用的物理空间不是磁盘,而是内存条。设备重启后,/tmp下文件全清空。
tmpfs文件系统产生原因是为了提高性能。程序运行时候产生的临时文件放在磁盘会影响性能,于是tmpfs作为虚拟内存子系统来储存文件。POSIX共享内存也是基于tmpfs来实现的。
tmpfs的最大空间由RM(Real Memory,即物理内存)和swap(硬盘虚拟的内存空间)组成。
查看挂载信息,可知 tmpfs 文件系统的挂载点有两个,一个/dev/shm,另一个为/tmp。默认情况下, /tmp 将最多使用一半内存。
/tmp # cat /etc/fstab
none /sys sysfs defaults 0 0
none /proc proc defaults 0 0
none /dev/shm tmpfs defaults 0 0
none /dev/pts devpts defaults 0 0
none /tmp tmpfs defaults 0 0
/dev/sda3 /data ext3 defaults 0 0
/dev/sda6 /boot ext3 defaults 0 0
/dev/sda5 /bootloader ext3 defaults 0 0
如果往/tmp文件夹加入大量文件,也会造成系统内存不足。
/tmp # free
total used free shared buffers cached
Mem: 2888012 2787560 100452 0 102128 959180
-/+ buffers/cache: 1726252 1161760
Swap: 0 0 0
/tmp # dd if=/dev/zero of=file_test4 bs=1M count=256
256+0 records in
256+0 records out
268435456 bytes (256.0MB) copied, 0.300576 seconds, 851.7MB/s
/tmp #
total used free shared buffers cached
Mem: 2888012 2801328 86684 0 1412 1106424
-/+ buffers/cache: 1693492 1194520
Swap: 0 0 0
进程内存
使用ps可以查看进程的状态
$ ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 119700 4384 ? Ss 11月03 0:09 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 11月03 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 11月03 0:31 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 11月03 0:00 [kworker/0:0H]
其中与内存相关项含义如下所示:
VSZ:虚拟内存大小。virtual memory size of the process in KiB (1024-byte units). Device mappings are currently excluded; this is subject to change. (alias vsize).
RSS:实际使用物理内存。resident set size, the non-swapped physical memory that a task has used (in kiloBytes). (alias rssize, rsz).
虚拟内存是对进程而言使用的内存,会比较大,可以理解为一个内存布局,建立虚拟内存和磁盘文件的映射关系。在进程调用的时候,查找虚拟内存,将虚拟内存对应磁盘文件拷贝到物理内存,进行调度寻址等操作。
进程使用的物理内存为RSS表示的物理内存大小,其中包括链接的动态库使用的内存,不只是单独进程使用的物理内存大小。
也可以通过/proc/下去查找对应进程id的相关内存信息。
/proc/pid/maps pid为进程号,显示当前进程所占用的虚拟地址。
/proc/pid/statm 进程所占用的内存。
内存不足时
- 使用sync,将系统缓存写入磁盘。
#sync
- 释放所有缓存
#echo 3 > /proc/sys/vm/drop_caches
cache释放说明:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches