隨時監控程式的記憶體使用大小對於服務的穩定和平時問題的查詢就有很重要的意義,比如nginx+php-fpm技術棧中對於每個php-fpm的程式記憶體的大小會影響程式的開啟數等。
那麼如何檢視執行中的程式佔用的記憶體大小呢? linux提供top命令,這個可以實時檢視每個程式的記憶體使用量,其中主要有兩個引數需要注意,RES和DATA引數。
top -p pid 然後 使用 f再點選DATA對應的標識就可以看見 DATA這一列了
RES是程式實際使用的,VIRT是虛擬和物理的總和,比如php-fpm的程式有記憶體限制 這個只能限制住RES。
CODE是編譯器獲取的,VIRT和DATA是 通過 malloc和free mmap等獲取的,RES是作業系統分配的。
可以使用下面的實際例子來講解下:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
int main(){
int *data, size, count, i;
printf( "fyi: your ints are %d bytes large\n", sizeof(int) );
printf( "Enter number of ints to malloc: " );
scanf( "%d", &size );
data = malloc( sizeof(int) * size );
if( !data ){
perror( "failed to malloc" );
exit( EXIT_FAILURE );
}
printf( "Enter number of ints to initialize: " );
scanf( "%d", &count );
for( i = 0; i < count; i++ ){
data[i] = 1337;
}
printf( "I'm going to hang out here until you hit <enter>" );
while( getchar() != '\n' );
while( getchar() != '\n' );
exit( EXIT_SUCCESS );
}複製程式碼
這個例子說明有多少記憶體分配,有多少記憶體被初始化,在執行時 分配了1250000位元組,初始化了500000位元組:
$ ./a.out
fyi: your ints are 4 bytes large
Enter number of ints to malloc: 1250000
Enter number of ints to initialize: 500000
TOp 檢視結果顯示複製程式碼
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP CODE DATA COMMAND
<program start>
11129 xxxxxxx 16 0 3628 408 336 S 0 0.0 0:00.00 3220 4 124 a.out
<allocate 1250000 ints>
11129 xxxxxxx 16 0 8512 476 392 S 0 0.0 0:00.00 8036 4 5008 a.out
<initialize 500000 ints>
11129 xxxxxxx 15 0 8512 2432 396 S 0 0.0 0:00.00 6080 4 5008 a.out複製程式碼
在malloc了1250000後,VIRT和DATA增加了,但是RES沒變。在初始化後 VIRT和DATA沒變,但是RES增加了。
VIRT是程式所有的虛擬記憶體,包括共享的,入動態連結庫等,DATA是虛擬棧和堆的大小。RES不是虛擬的,它是記憶體在指定時間真實使用的記憶體。