1、内存-total
total大小略小于真实的物理内存大小:主要是因为Kernel自己占用及reserve了一小部分。
”sudo dmidecode -t memory”可以查看精确的物理内存
命令显示该机器有8个32GB内存
2、buffers和cached有什么区别
free中的buffer和cache都是操作系统用内存空间来提升文件系统性能的手段。其本质都是缓冲部分文件系统的信息到内存。只不过缓存的内容有所区别:
- buffers里面缓存的是“文件系统的元数据metadata及 tracking in-flight pages”,也就是说是文件的属性权限等信息。
- cache里面缓存的是文件内容。
实验1:用vi打开一个大文件,之后马上再记录一下free的输出,会发现cached内存明显增加。
实验2:做一个路径比较深的find, 如”sudo find /* -name *.conf”, 之后马上再记录一下free的输出,会发现buffers内存明显增加。
3、-/+ buffers/cache:是真正被应用程序所占据的内存(刨去被操作系统“借用”的部分)
4、Swap: 这一行是SWAP(交换空间)的描述。只有当操作系统把所有内存(包括cached和buffers)都释放给应用程序还无法满足应用程序要求是才会用到SWAP。由于SWAP的本质是用硬盘虚拟内存空间,起性能远低于真正的内存操作。因此对线上server来讲,在正常工作是应该永远不会用到SWAP.
--------------------------------------------PS-------------------------------------------------
PS命令的参数项和输出项众多,其中和内存相关的有以下几列:
%MEM | =RSS / Total(free命令) * 100%, 标识这进程使用物理内存占总物理内存的百分比 |
VSZ (kb) | Virtual Set Size 当前进程可访问的全部虚拟内存大小(包含共享库所占用的以及交换到SWAP的) |
RSS (kb) | Resident Set Size当前进程所实际使用的内存大小(包含共享库所占用的) |
a. VSZ大于RSS. 由于应用进程申请的内存不会马上100%的占用。其中一时还没有使用的部分会被操作系统“借走”充当cache或buffer(参考前面free命令的分析)。而当需要使用是再由操作系统返还,这个过程对应用进程来说是透明的。另外如果进程开了多个线程,且每个线程都去load同一个共享库,则这部分内存占用会在VSZ中被重复计算多次。
b. RSS是应用进程实际使用的内存大小,但如果对所有进程的RSS值相加其总值通常是大于物理内存大小的。原因是进程的RSS值里面包含了共享库所占用的空间。一个共享库有可能被多个进程load了多次,也就在各个进程的RSS指标里被计算了多次。
c. 由于RSS有多个进程共享内存被重复计算的问题,还有一个PSS的指标指的是对这些共享内存部分在共享它的进程间做均摊之后加上进程私有内存。不过PS命令无法输出PSS指标,Linux下有个叫做smem的工具可以输出PSS。另外,如果不想安装smem工具的话可以用以下命令:”sudo cat /proc/{pid}/smaps | grep Pss”,然后对每行的值做累加得出进程的PSS
---------------------------------------------------------top------------------------------------
%MEM | 等同于ps命令输出中的%MEM |
VIRT | 等同于ps命令输出中的VSZ |
RES | 等同于ps命令输出中的RSS |
SHR | “共享内存”确切的说是“可能共享”的内存。 |