top命令之RES,DATA

coopbee發表於2018-07-28

  隨時監控程式的記憶體使用大小對於服務的穩定和平時問題的查詢就有很重要的意義,比如nginx+php-fpm技術棧中對於每個php-fpm的程式記憶體的大小會影響程式的開啟數等。

  那麼如何檢視執行中的程式佔用的記憶體大小呢? linux提供top命令,這個可以實時檢視每個程式的記憶體使用量,其中主要有兩個引數需要注意,RES和DATA引數。

       top -p pid 然後 使用 f再點選DATA對應的標識就可以看見 DATA這一列了    

       top命令之RES,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不是虛擬的,它是記憶體在指定時間真實使用的記憶體。


相關文章