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 nginx
là 1234
. 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.