Lệnh pmap trong linux với các ví dụ dễ hiểu

Lệnh pmap trong Linux là một công cụ hữu ích để xem thông tin chi tiết về không gian địa chỉ bộ nhớ của một tiến trình. Nó hiển thị các vùng nhớ được ánh xạ, kích thước và quyền truy cập của chúng, giúp bạn hiểu rõ cách tiến trình sử dụng bộ nhớ. Sử dụng pmap, bạn có thể dễ dàng phát hiện các vấn đề liên quan đến bộ nhớ như rò rỉ hoặc sử dụng bộ nhớ quá mức, từ đó tối ưu hóa hiệu suất hệ thống.

Lệnh pmap trong linux là gì?

Lệnh command pmap in linux là một công cụ dòng lệnh mạnh mẽ, giúp bạn xem thông tin chi tiết về không gian địa chỉ bộ nhớ của một tiến trình đang chạy. Nó hiển thị các vùng nhớ được ánh xạ vào tiến trình, bao gồm cả các thư viện dùng chung và các tệp tin được ánh xạ. Sử dụng pmap, bạn có thể dễ dàng xác định các vấn đề về bộ nhớ, như rò rỉ bộ nhớ hoặc sử dụng bộ nhớ quá mức. Thông tin này rất hữu ích cho việc gỡ lỗi và tối ưu hóa hiệu suất ứng dụng của bạn. Ví dụ, bạn có thể xem kích thước và quyền truy cập của từng vùng nhớ được ánh xạ vào tiến trình.

Tìm hiểu về lệnh pmap

Trong bước này, chúng ta sẽ khám phá lệnh pmap, một công cụ mạnh mẽ trong Linux.

Lệnh này cung cấp thông tin chi tiết về việc sử dụng bộ nhớ của một tiến trình đang chạy.

pmap đặc biệt hữu ích để xác định rò rỉ bộ nhớ và hiểu footprint bộ nhớ của ứng dụng.

Hãy bắt đầu bằng cách chạy lệnh pmap trên một tiến trình đang chạy để phân tích.

Chúng ta sẽ sử dụng lệnh top để tìm Process ID (PID) của tiến trình mà ta muốn phân tích.

top

Ví dụ về kết quả:

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
 1234 labex     20   0  124.3m  12.3m   3.4m S   0.3   0.6   0:00.12 nginx

Trong ví dụ này, PID của tiến trình nginx1234, bạn hãy lưu ý PID này.

Bây giờ, chúng ta có thể sử dụng lệnh pmap để phân tích việc sử dụng bộ nhớ của tiến trình này.

sudo pmap 1234

Ví dụ về kết quả:

1234:   nginx: nginx worker process
0000562a0f4f3000      4K r-x-- /usr/sbin/nginx
0000562a0f6f4000    132K r---- /usr/sbin/nginx
0000562a0f6ff000     16K rw--- /usr/sbin/nginx
0000562a0f703000     12K rw---   [ anon ]
0000562a0f706000   2044K r-x-- /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0f908000   2048K ----- /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0fb08000     16K r---- /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0fb0c000      8K rw--- /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0fb0e000     20K rw---   [ anon ]
0000562a0fb13000    132K r-x-- /lib/x86_64-linux-gnu/ld-2.35.so
0000562a0fd2c000     12K r---- /lib/x86_64-linux-gnu/ld-2.35.so
0000562a0fd2f000      4K rw--- /lib/x86_64-linux-gnu/ld-2.35.so
0000562a0fd30000      4K rw---   [ anon ]
total            4,436K

Lệnh pmap cung cấp thông tin chi tiết về việc sử dụng bộ nhớ của tiến trình đã chỉ định.

Mỗi dòng đại diện cho một segment bộ nhớ, cùng với thông tin về địa chỉ bắt đầu, kích thước và quyền.

Ngoài ra, nó còn cho biết file hoặc thư viện liên kết với segment đó để bạn tiện theo dõi.

Kết quả này có thể giúp bạn hiểu việc sử dụng bộ nhớ của ứng dụng và xác định rò rỉ bộ nhớ tiềm ẩn.

Từ đó, bạn có thể tối ưu hóa hiệu suất ứng dụng một cách hiệu quả hơn.

Phân tích mức sử dụng bộ nhớ của một tiến trình

Trong bước này, chúng ta sẽ đi sâu vào phân tích mức sử dụng bộ nhớ của tiến trình bằng lệnh pmap.

Chúng ta sẽ khám phá các tùy chọn và kỹ thuật khác nhau để hiểu rõ cách tiến trình sử dụng bộ nhớ hệ thống.

Hãy bắt đầu bằng cách chạy lệnh pmap với tùy chọn -x, cung cấp thông tin chi tiết hơn về các phân đoạn bộ nhớ.

sudo pmap -x 1234

Ví dụ về đầu ra:

1234:   nginx: nginx worker process
Address   Kbytes Mode  Offset           Device     Mapping
0000562a0f4f3000      4     r-x--    0000000000000000 /usr/sbin/nginx
0000562a0f6f4000    132     r----   0000000000001000 /usr/sbin/nginx
0000562a0f6ff000     16     rw---   0000000000002000 /usr/sbin/nginx
0000562a0f703000     12     rw---                [ anon ]
0000562a0f706000   2044     r-x--   0000000000000000 /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0f908000   2048     -----   0000000000202000 /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0fb08000     16     r----   0000000000202000 /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0fb0c000      8     rw---   0000000000204000 /lib/x86_64-linux-gnu/libc-2.35.so
0000562a0fb0e000     20     rw---                [ anon ]
0000562a0fb13000    132     r-x--   0000000000000000 /lib/x86_64-linux-gnu/ld-2.35.so
0000562a0fd2c000     12     r----   0000000000019000 /lib/x86_64-linux-gnu/ld-2.35.so
0000562a0fd2f000      4     rw---   000000000001b000 /lib/x86_64-linux-gnu/ld-2.35.so
0000562a0fd30000      4     rw---                [ anon ]
total            4,436

Thông tin bổ sung từ tùy chọn -x bao gồm chế độ bộ nhớ (đọc, ghi, thực thi), offset trong file được ánh xạ.

Nó cũng bao gồm số thiết bị và tên của file hoặc thư viện được ánh xạ.

Bạn cũng có thể sử dụng lệnh pmap với tùy chọn -d để hiển thị các phân đoạn bộ nhớ động mà tiến trình sử dụng.

sudo pmap -d 1234

Ví dụ về đầu ra:

1234:   nginx: nginx worker process
Address   Kbytes Mode  Offset           Device     Mapping
0000562a0f703000     12     rw---                [ anon ]
0000562a0fb0e000     20     rw---                [ anon ]
0000562a0fd30000      4     rw---                [ anon ]
total                36

Tùy chọn -d hiển thị các phân đoạn bộ nhớ ẩn danh, được cấp phát động bởi tiến trình.

Các phân đoạn này không liên kết với bất kỳ file hoặc thư viện cụ thể nào.

Các tùy chọn lệnh pmap này giúp bạn xác định các mẫu sử dụng bộ nhớ của ứng dụng.

Chúng cũng giúp bạn phát hiện rò rỉ bộ nhớ tiềm ẩn và tối ưu hóa hiệu suất của ứng dụng.

Xác định Memory Leak với pmap

Trong bước cuối cùng này, ta sẽ dùng lệnh pmap để tìm memory leak trong process đang chạy.

Memory leak có thể gây tiêu tốn bộ nhớ quá mức và các vấn đề về hiệu năng, nên việc phát hiện rất quan trọng.

Hãy bắt đầu bằng cách chạy một script Python đơn giản mô phỏng memory leak như sau:

cat << EOF > leak.py
import time

def leak():
    x = []
    while True:
        x.append([0] * 1000000)
        time.sleep(1)

if __name__ == "__main__":
    leak()
EOF

python3 leak.py &

Script này liên tục cấp phát các mảng lớn, dẫn đến memory leak. Ta sẽ dùng lệnh pmap để theo dõi việc sử dụng bộ nhớ của process này:

sudo pmap -x $(pgrep -f leak.py)

Ví dụ về kết quả (sau vài phút):

18768:   python3 leak.py
Address   Kbytes Mode  Offset           Device     Mapping
00005612b3a4f000      4     r-x--    0000000000000000 /usr/bin/python3.10
00005612b3c50000   1028     r----   0000000000001000 /usr/bin/python3.10
00005612b3d54000    408     rw---   0000000000002000 /usr/bin/python3.10
00005612b3e7c000    144     rw---                [ anon ]
00005612b3ea0000   2048     r-x--   0000000000000000 /lib/x86_64-linux-gnu/libc-2.35.so
00005612b40a0000   2048     -----   0000000000200000 /lib/x86_64-linux-gnu/libc-2.35.so
00005612b42a0000     16     r----   0000000000200000 /lib/x86_64-linux-gnu/libc-2.35.so
00005612b42a4000      8     rw---   0000000000202000 /lib/x86_64-linux-gnu/libc-2.35.so
00005612b42a6000     20     rw---                [ anon ]
00005612b42ab000    132     r-x--   0000000000000000 /lib/x86_64-linux-gnu/ld-2.35.so
00005612b44c4000     12     r----   0000000000019000 /lib/x86_64-linux-gnu/ld-2.35.so
00005612b44c7000      4     rw---   000000000001b000 /lib/x86_64-linux-gnu/ld-2.35.so
00005612b44c8000      4     rw---                [ anon ]
00005612b44c9000 1048576     rw---                [ anon ]
total           1,054,448

Bạn có thể thấy, việc sử dụng bộ nhớ của process Python tăng lên theo thời gian, cho thấy memory leak.

Lệnh pmap cho thấy process đang cấp phát một lượng lớn bộ nhớ ẩn danh, đây là dấu hiệu rõ ràng của memory leak.

Để xác nhận memory leak, bạn có thể chạy lệnh pmap định kỳ và quan sát sự tăng trưởng trong "total".

Kết luận cho linux pmap command

Tóm lại, linux pmap command là một công cụ mạnh mẽ để hiểu rõ hơn về cách bộ nhớ được sử dụng bởi một tiến trình. Nó giúp bạn xác định các vấn đề về bộ nhớ, như rò rỉ bộ nhớ hoặc sử dụng bộ nhớ không hiệu quả. Với khả năng hiển thị chi tiết về các vùng nhớ được ánh xạ, bạn có thể dễ dàng phân tích và tối ưu hóa hiệu suất ứng dụng. Hãy thử nghiệm với các tùy chọn khác nhau của lệnh để khám phá toàn bộ tiềm năng của nó. Hy vọng bài viết này đã cung cấp cho bạn một cái nhìn tổng quan hữu ích về lệnh pmap. Chúc bạn thành công trong việc quản lý bộ nhớ trên hệ thống Linux của mình! Đừng ngần ngại tìm hiểu thêm các công cụ khác để nâng cao kỹ năng quản trị hệ thống.

Last Updated : 15/10/2025