linux服务器分析优化
linux服务器分析优化
Linux内存使用情况分析
1.linux系统使用了多少内存
在系统使用的情况下,我们可以使用free,top,vmstat,或是cat /proc/meminfo来得到系统内存的使用数据,但是显示给我们的结果也往往令我们失望:
peter@newboy:~$ free
total used free shared buffers cached
Mem: 3096648 2124360 972288 0 46756 421844
-/+ buffers/cache: 1655760 1440888
Swap: 0 0 0
上面输出结果中哪一个数据能够准确的反应当前情况下系统使用内存的值,恐怕大家都有点糊涂。
peter@newboy:~$top
top - 16:08:07 up 2:03, 4 users, load average: 0.28, 0.37, 0.28
Tasks: 166 total, 2 running, 164 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.6%us, 21.5%sy, 6.9%ni, 60.7%id, 1.0%wa, 1.0%hi, 1.3%si, 0.0%st
Mem: 3096648k total, 2126136k used, 970512k free, 46988k buffers
Swap: 0k total, 0k used, 0k free, 422992k cached
这组数据中哪一个可以反应当前系统的占用情况呢,同样让人糊涂。以上两组数据都可以看出内存总量是3096648k,但是使用量很显然不是2126136k,因为运行的程序占用的内存不可能有这么大。那么是free中显示的1655760K吗?这个只是包含了真正使用的内存,但是也不能完整的反映使用的内存的大小。
让我们再看看vmstat 中的数据吧
peter@newboy:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 0 966296 47452 425028 0 0 48 13 775 475 10 6 84 1
同样令人糊涂。还有cat /proc/meminfo的数据(只截取了其中一部分):
在系统使用的情况下,我们可以使用free,top,vmstat,或是cat /proc/meminfo来得到系统内存的使用数据,但是显示给我们的结果也往往令我们失望:
peter@newboy:~$ free
total used free shared buffers cached
Mem: 3096648 2124360 972288 0 46756 421844
-/+ buffers/cache: 1655760 1440888
Swap: 0 0 0
上面输出结果中哪一个数据能够准确的反应当前情况下系统使用内存的值,恐怕大家都有点糊涂。
peter@newboy:~$top
top - 16:08:07 up 2:03, 4 users, load average: 0.28, 0.37, 0.28
Tasks: 166 total, 2 running, 164 sleeping, 0 stopped, 0 zombie
Cpu(s): 7.6%us, 21.5%sy, 6.9%ni, 60.7%id, 1.0%wa, 1.0%hi, 1.3%si, 0.0%st
Mem: 3096648k total, 2126136k used, 970512k free, 46988k buffers
Swap: 0k total, 0k used, 0k free, 422992k cached
这组数据中哪一个可以反应当前系统的占用情况呢,同样让人糊涂。以上两组数据都可以看出内存总量是3096648k,但是使用量很显然不是2126136k,因为运行的程序占用的内存不可能有这么大。那么是free中显示的1655760K吗?这个只是包含了真正使用的内存,但是也不能完整的反映使用的内存的大小。
让我们再看看vmstat 中的数据吧
peter@newboy:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
3 0 0 966296 47452 425028 0 0 48 13 775 475 10 6 84 1
同样令人糊涂。还有cat /proc/meminfo的数据(只截取了其中一部分):
对于内存负载分析其中关键的字段是:
swpd:虚拟内存的使用总量。
si:每秒从虚拟内存读入内存的大小。
so:每秒从内存写入虚拟内存的大小。
如果这3个字段的值比较高说明出现了内存瓶颈。
也可以使用free 来标识内存的负载情况.
root@newboy:~# cat /proc/meminfo
MemTotal: 3096648 kB
MemFree: 964132 kB
Buffers: 47752 kB
Cached: 425412 kB
SwapCached: 0 kB
Active: 1575616 kB
Inactive: 316444 kB
Active(anon): 1428260 kB
Inactive(anon): 16 kB
Active(file): 147356 kB
Inactive(file): 316428 kB
这些都有点令人糊涂,究竟当前系统使用了多少内存呢?
2.究竟使用了多少内存
这些命令的本身都是很好的查看内存的工具,给出了很好的参考价值,但是就是没有给出一个较为直观的内存占用的信息。这些工具显示的数据没有错误,造成不能准确的显示Linux下系统程序占用内存的真正原因是Linux本身的特性决定的。
众所周知,Linux系统本身的特点是会将大量的工作在内存中进行,这样就能减少系统的I/O时间。故有很多数据和使用过的结构在内存中都会保留,以备程序重新运行所用。linux在统计使用的内存的过程中包括了buffer的内存和cached的内存。前者是那些即将写到磁盘的数据的临时存放区,后者是那些将继续被cpu读取的数据的存放区。所以使用内存的情况包括:程序使用的内存的大小,还包括linux buffer的部分和cache的部分。从free的命令结果中也可以看出来:
root@newboy:/proc/1593# free -m
total used free shared buffers cached
Mem: 3023 901 2122 0 50 417
-/+ buffers/cache: 434 2589
Swap: 0 0 0
从上面的数据可以看出来901=50+417+434 这个数据说明被使用的内存中包含了buffer的内容也包含了cached的内容。当然实际的使用内存的数量还不全是434M内存,
上面的内存数据还可以得到一下的等式:3023=901+2122, 3023=50+417+434+2122, 3023=434+2589。这些等式说明了linux使用内存的情况