Lệnh pmap trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh pmap của Linux, một công cụ mạnh mẽ để phân tích mức sử dụng bộ nhớ của các tiến trình đang chạy. Lab này sẽ bao gồm việc tìm hiểu lệnh pmap, phân tích mức sử dụng bộ nhớ của một tiến trình và xác định các khả năng rò rỉ bộ nhớ. Lệnh pmap cung cấp một bản phân tích chi tiết về các phân đoạn bộ nhớ được sử dụng bởi một tiến trình, bao gồm địa chỉ bắt đầu, kích thước, quyền và các tệp hoặc thư viện được liên kết. Thông tin này có thể vô giá để tối ưu hóa hiệu suất ứng dụng và xác định các sự cố liên quan đến bộ nhớ. Lab sẽ hướng dẫn bạn thông qua các ví dụ thực tế và các trường hợp sử dụng cho lệnh pmap, giúp bạn phát triển các kỹ năng quản lý và giám sát hệ thống thiết yếu.

Tìm hiểu 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 cung cấp thông tin chi tiết về mức sử dụng bộ nhớ của một tiến trình đang chạy. Lệnh pmap đặc biệt hữu ích để xác định rò rỉ bộ nhớ và hiểu footprint bộ nhớ của các ứng dụng của bạn.

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. Chúng ta sẽ sử dụng lệnh top để tìm ID tiến trình (PID) của một tiến trình mà chúng ta muốn phân tích:

top

Ví dụ đầu ra:

  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ây giờ chúng ta có thể sử dụng lệnh pmap để phân tích mức sử dụng bộ nhớ của tiến trình này:

sudo pmap 1234

Ví dụ đầu ra:

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 một bản phân tích chi tiết về mức sử dụng bộ nhớ của tiến trình được chỉ định. Mỗi dòng đại diện cho một phân đoạn bộ nhớ, với thông tin về địa chỉ bắt đầu, kích thước, quyền và tệp hoặc thư viện được liên kết với phân đoạn đó.

Đầu ra này có thể giúp bạn hiểu mức sử dụng bộ nhớ của ứng dụng của bạn, xác định các khả năng rò rỉ bộ nhớ và tối ưu hóa hiệu suất của 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 hơn vào phân tích mức sử dụng bộ nhớ của một 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 để có được sự hiểu biết toàn diện về cách một tiến trình đang 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ớ được sử dụng bởi tiến trình:

sudo pmap -x 1234

Ví dụ đầ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 được cung cấp bởi tùy chọn -x bao gồm chế độ bộ nhớ (đọc, ghi, thực thi), offset trong tệp đã ánh xạ, số thiết bị và tên của tệp hoặc thư viện đã á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 được sử dụng bởi tiến trình:

sudo pmap -d 1234

Ví dụ đầ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 tiến trình phân bổ động và không liên kết với bất kỳ tệp hoặc thư viện cụ thể nào.

Các tùy chọn lệnh pmap này có thể giúp bạn xác định các mẫu sử dụng bộ nhớ của ứng dụng của bạn, phát hiện các khả năng rò rỉ bộ nhớ và tối ưu hóa hiệu suất của nó.

Xác định rò rỉ bộ nhớ với pmap

Trong bước cuối cùng này, chúng ta sẽ tìm hiểu cách sử dụng lệnh pmap để xác định các khả năng rò rỉ bộ nhớ trong một tiến trình đang chạy. Rò rỉ bộ nhớ có thể dẫn đến tiêu thụ bộ nhớ quá mức và các vấn đề về hiệu suất, vì vậy điều quan trọng là có thể phát hiện và giải quyết chúng.

Hãy bắt đầu bằng cách chạy một script Python đơn giản mô phỏng rò rỉ bộ nhớ:

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 phân bổ các mảng lớn, cuối cùng sẽ dẫn đến rò rỉ bộ nhớ. Hãy sử dụng lệnh pmap để theo dõi mức sử dụng bộ nhớ của tiến trình này:

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

Ví dụ đầu ra (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

Như bạn có thể thấy, mức sử dụng bộ nhớ của tiến trình Python tiếp tục tăng theo thời gian, cho thấy khả năng rò rỉ bộ nhớ. Lệnh pmap cho thấy rằng tiến trình đang phân bổ một lượng lớn bộ nhớ ẩn danh, đây là một dấu hiệu rõ ràng của rò rỉ bộ nhớ.

Để xác nhận rò rỉ bộ nhớ, bạn có thể chạy lệnh pmap định kỳ và quan sát sự tăng trưởng trong mức sử dụng bộ nhớ "total".

Tóm tắt

Trong lab này, chúng ta đã khám phá lệnh pmap của Linux, cung cấp thông tin chi tiết về mức sử dụng bộ nhớ của một tiến trình đang chạy. Chúng ta đã học cách sử dụng lệnh pmap để phân tích mức sử dụng bộ nhớ của một tiến trình, bao gồm xác định các phân đoạn bộ nhớ, kích thước của chúng và các tệp hoặc thư viện được liên kết. Thông tin này có thể có giá trị để hiểu footprint bộ nhớ của các ứng dụng của bạn và xác định các khả năng rò rỉ bộ nhớ.

Ngoài ra, chúng ta đã thảo luận về cách lệnh pmap có thể được sử dụng để xác định rò rỉ bộ nhớ trong các ứng dụng của bạn. Bằng cách thường xuyên theo dõi mức sử dụng bộ nhớ của các tiến trình của bạn bằng pmap, bạn có thể phát hiện bất kỳ sự gia tăng bất ngờ nào trong mức sử dụng bộ nhớ, điều này có thể cho thấy rò rỉ bộ nhớ. Điều này có thể giúp bạn khắc phục sự cố và giải quyết các vấn đề về hiệu suất trong các ứng dụng của bạn.

400+ câu lệnh phổ biến trong Linux