linux tmp目录与内存解析

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 进程所占用的内存。

内存不足时

  1. 使用sync,将系统缓存写入磁盘。
#sync
  1. 释放所有缓存
#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

你可能感兴趣的:(linux tmp目录与内存解析)