2013-01-17 27 views
5

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?

  1. đầ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 
    
  2. 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!

Trả lời

2

Cột SHR trong top không báo cáo cùng một điều mà pmap s shared nhập. top đang báo cáo số lượng bộ nhớ được chia sẻ với các quy trình khác vì nó nằm trong thư viện động được tải một lần vào bộ nhớ và tất cả các quy trình sử dụng thư viện đó bao gồm các trang giống nhau trong hình ảnh của chúng, vì các trang đó chỉ đọc. pmap dường như đang hiển thị các phân đoạn "bộ nhớ chia sẻ", là các trang dữ liệu có thể đọc hoặc ghi chỉ đọc và được chia sẻ giữa các quá trình với shmget() và các chức năng liên quan.

Các vấn đề liên quan