Tôi đã cố gắng để có được kích thước bộ nhớ chia sẻ của một quá trình trên Linux. Dưới đây là kết quả của việc sử dụng 2 lệnh khác nhau:Cách nhận kích thước bộ nhớ được chia sẻ chính xác của một quy trình?
đầu và kiểm tra với lĩnh vực 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
Bạn có thể thấy rằng kích thước bộ nhớ chia sẻ trong pmap nhỏ hơn nhiều so với đầu.
Tôi đọc một số mã nguồn để tìm lý do. Có vẻ như đầu đọc giá trị từ/proc // statm và các giá trị được tính bằng:
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;
}
Dường như tất cả các trang tệp được tính là bộ nhớ dùng chung?
Và lệnh pmap đang đọc các thông tin từ/proc // bản đồ và sau đó tính toán bộ nhớ chia sẻ thông qua một số cờ:
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
Nếu cờ [3] == 's' thì bản đồ này sẽ được tính là chia sẻ.
Vì vậy, câu hỏi của tôi là câu hỏi nào chính xác hơn? Và tại sao họ có các phương pháp khác nhau để tính toán kích thước bộ nhớ chia sẻ?
Cảm ơn trước!