Linuxでプロセスの共有メモリサイズを取得しようとしました。2つの異なるコマンドを使用した結果は次のとおりです。
トップとSHRフィールドで確認してください:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1734 root 20 0 201m 4072 1012 S 0.0 0.1 22:00.65 php-fpm
pmap -d:
mapped: 206672K writeable/private: 4352K shared: 128K
pmapの共有メモリサイズがtopよりもはるかに小さいことがわかります。
理由を見つけるためにいくつかのソースコードを読みました。topは/proc// statmから値を読み取っているようで、値は次のように計算されます。
unsigned long task_statm(struct mm_struct *mm,
unsigned long *shared, unsigned long *text,
unsigned long *data, unsigned long *resident)
{
*shared = get_mm_counter(mm, MM_FILEPAGES);
*text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK))
>> PAGE_SHIFT;
*data = mm->total_vm - mm->shared_vm;
*resident = *shared + get_mm_counter(mm, MM_ANONPAGES);
return mm->total_vm;
}
すべてのファイルページが共有メモリとしてカウントされているようですか?
そして、pmapコマンドは/ proc // mapsから情報を読み取り、いくつかのフラグを使用して共有メモリを計算します。
3dc822a000-3dc822d000 rw-p 0002a000 08:13 5134288 /usr/lib64/libmcrypt.so.4.4.8
start-end flags file_offset dev_major:dev_minor inode
flags [3] =='s'の場合、このマップは共有マップとしてカウントされます。
だから私の質問はどちらがより正確ですか?そして、なぜ彼らは共有メモリサイズを計算するための異なる方法を持っているのですか?
前もって感謝します!