Theo dõi hiệu năng của hệ điều hành (HĐH) mà ứng dụng được chạy trên đó là bước đầu tiên trong quá trình cải tiến hiệu năng của ứng dụng.
Tại sao cần phải theo dõi hiệu năng của HĐH
Chúng ta quan sát hệ điều hành để có được cảm nhận về vấn đề hiệu năng đang phát sinh. Nói cách khác, chúng ta thăm dò xem ứng dụng có bộc lộ ra triệu chứng nào cho thấy hiệu năng kém không? Căn cứ vào triệu chứng quan sát được, chúng ta có thể xác định các bước hành động tiếp theo trong việc chẩn đoán các vấn đề hiệu năng. Theo dõi hiệu năng hệ điều hành được thực hiện thông qua các hoạt động theo dõi sau:
- Theo dõi hoạt động của CPU
- Theo dõi hoạt động vào/ra mạng
- Theo dõi hoạt động vào/ra ổ đĩa
- Theo dõi hoạt động của bộ nhớ ảo
- Theo dõi hoạt động của các tiến trình
Theo dõi hoạt động của CPU
Các chỉ số đo đạc về sử dụng CPU
- User CPU time: Là lượng thời gian CPU dành cho tiến trình chạy các tác vụ của riêng nó (chạy ngoài kernel của hệ điều hành).
- System CPU time: Là lượng thời gian CPU dùng để khai thác tài nguyên, chạy trong kernel của hệ điều hành.
- Idle CPU time: Là lượng thời gian CPU không được sử dụng.
- Voluntary context switch: Tiến trình tự nguyện nhường lại CPU sau khi chạy hết thời gian dự kiến của nó hoặc nó yêu cầu sử dụng tài nguyên hiện không khả dụng.
- Involuntary context switch: Tiến trình bị gián đoạn và nhường lại CPU trước khi hoàn tất thời gian chạy theo lịch trình của nó do hệ thống xác định một tiến trình ưu tiên cao hơn cần thực thi.
Việc theo dõi hoạt động của CPU cần được xem xét thêm nếu các chỉ số đo đạc thể hiện:
- Giá trị System time cao: chỉ ra rằng có một lượng lớn chu kỳ chạy của CPU được sử dụng trong kernel của hệ điều hành. Giá trị này cũng chỉ ra rằng có thể đã xảy ra tình huống tranh giành tài nguyên trong hệ thống. Việc giảm lượng thời gian thực thi mã lệnh trong kernel sẽ làm tăng thời lượng thực thi tác vụ của riêng ứng dụng (tăng User time).
- Giá trị VCX cao: có thể là do sự tương tranh giữa các hàm hoặc khối đồng bộ (synchronized method/block) hoặc các khóa (lock) của Java Concurrency API.
- Giá trị ICX cao: cần phải xem xét do thao tác context switch rất tốn kém - thứ nhất mỗi một context switch tiêu tốn một lượng lớn xung nhịp CPU (CPU clock cycle); thứ hai, context switch có thể khiến cho phải nạp dữ liệu từ bộ nhớ vào thanh ghi thay vì từ CPU cache, việc này cũng tiêu tốn lượng xung nhịp CPU lớn. Do đó, ứng dụng phát sinh giá trị ICX cao cũng cần phải được xem xét về các vấn đề hiệu năng.
Công cụ theo dõi về sử dụng CPU
prstat (Solaris)
Công cụ prstat là phần mềm dòng lệnh có chức năng khảo sát hoạt động của các tiến trình đang chạy trên hệ thống và hiển thị báo cáo thống kê dựa trên tùy chọn về thông tin muốn kết xuất và thứ tự sắp xếp. prstat cung cấp các tùy chọn cho phép chỉ khảo sát trên một số các tiến trình xác định bởi PID, UID, CPU ID, v.v. Mặc định, prstat hiển thị toàn bộ thời gian sử dụng CPU đo được trên mỗi tiến trình.
Để hiển thị thông tin trạng thái chi tiết (có chứa thông tin VCX và IVCX), chúng ta có thể sử dụng prstat với tham số -m:
Để hiển thị thông tin về từng tiến trình con (lightweight process), chúng ta sử dụng tham số -L. Tương tự ví dụ trên, để hiển thị thông tin trạng thái chi tiết với từng tiến trình con, chúng ta kết hợp hai tham số -Lm như sau:
cpubar (Solaris)
Công cụ giao diện đồ họa hiển thị thông tin thống kê tổng quan về hoạt động của CPU, các tiến trình, tình trạng sử dụng bộ nhớ.
Đối với CPU, màu Xanh lá cây (User time), Đỏ (System tile), Xanh da trời (Idle time).
vmstat (Linux & Solaris)
Công cụ vmstat là phần mềm dòng lệnh dùng để hiển thị lên màn hình console các thông số về sử dụng CPU trong nhiều lần cách quãng liên tiếp. Mỗi thông số đọc được trong một lần đọc được gọi là mẫu chọn (sample). Những mẫu chọn này cung cấp một cái nhìn tổng quan về tỉ lệ phần trăm user time (us), system time (sy) và idle time (id).
mpstat (Linux & Solaris)
Công cụ mpstat là phần mềm dòng lệnh dùng để hiển thị thống kê về hoạt động của bộ vi xử lý (micro-processor). mpstat trên Linux và Solaris có một chút khác biệt ở thông tin hiển thị.
Kết quả chạy lệnh trên Linux:
$ mpstat
Linux 3.2.0-63-generic-pae (drupalex-ubuntu) 10/13/2014 _i686_ (2 CPU)
02:31:55 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
02:31:55 PM all 27.67 0.02 7.02 2.38 0.02 0.09 0.00 0.00 62.80
Kết quả chạy lệnh trên Solaris 11:
$ mpstat
CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 0 0 0 329 121 169 6 0 0 0 406 0 1 0 98
Theo dõi Network I/O
Thông tin cần biết về Network I/O
Nếu một ứng dụng có sử dụng mạng (hoặc ổ đĩa), ta dễ dàng nhận ra hiệu năng đạt được tốt nhất khi giảm thiểu số lượng truy cập mạng (hoặc ổ đĩa). Vì vậy, nếu một ứng dụng truy cập mạng hay ổ đĩa, hãy suy xét xem ứng dụng tạo ra có truy cập quá nhiều mạng hoặc ổ đĩa không? Giám sát các ứng dụng truy cập mạng sẽ cung cấp cho bạn một “cảm giác” về lượng truy cập mạng có quá nhiều hay không?
Công cụ theo dõi Network I/O
tcptop (Solaris)
Công cụ dòng lệnh tcptop hiển thị thông tin thống kê về lưu lượng truy cập mạng của từng tiến trình trong hệ thống. Nó chỉ ra rằng, người dùng nào đang chạy cái gì và sử dụng bao nhiêu thông lượng mạng.
nicstat (Solaris)
Công cụ dòng lệnh nicstat hiển thị thông tin thống kê về lưu lượng mạng (network trafic), tính theo Kbyte, số lượng Packet hoặc dung lượng trung bình.
Các trường thông tin hiển thị bao gồm:
- Int (Interface): tên của giao diện mạng.
- rKB/s (read Kbytes/s): tốc độ đọc mạng tính theo Kilobyte.
- wKB/s (write Kbytes/s): tốc độ ghi mạng tính theo Kilobyte.
- rPk/s (read Packets/s): tốc độ đọc mạng tính theo số lượng Packet / giây.
- wPk/s (write Packets/s): tốc độ ghi mạng tính theo số lượng Packet / giây.
- rAvs (read Average size, bytes): kích thước đọc trung bình, tính theo số byte.
- wAvs (write Average size, bytes): kích thước ghi trung bình, tính theo số byte.
- %Util (%Utilisation (r+w/ifspeed)): tính bằng số lượng byte được chuyển chia cho tốc độ của Interface (nếu xác định được tốc độ Interface).
- Sat (Saturation): độ bão hòa được xác định bằng cách đếm số lượng lỗi đọc/ghi phát sinh bởi Interface chạy ở mức bão hòa.
Theo dõi Disk I/O
Thông tin cần biết về Disk I/O
- Số lượng các lần truy cập ổ đĩa: Mỗi lần truy cập ổ đĩa là một hoạt động tốn kém đối với hệ thống, quá trình gửi - chờ - nhận kết quả (Round Trip Time) của thao tác đọc dữ liệu từ ổ đĩa rất tốn kém thời gian. Do đó chúng ta mong muốn tối thiểu hóa số lần truy cập ổ đĩa để đọc dữ liệu.
- Độ trễ và độ trễ trung bình: là khoảng thời gian cần có để lấy dữ liệu từ ỗ đĩa.
Công cụ theo dõi Disk I/O
iostat (Linux & Solaris)
Công cụ dòng lệnh iostat được sử dụng để thống kê các thông số vào / ra của các thiết bị lưu trữ.
iotop (Linux & Solaris)
Công cụ iotop là phần mềm dòng lệnh, có chức năng theo dõi thông tin về quá trình vào ra (I/O) ổ đĩa từ hệ điều hành (nhân Linux từ 2.6.20) và hiển thị thông tin dưới dạng bảng liệt kê lượng truy cập vào ra ổ đĩa thực hiện bởi các tiến trình.
Theo dõi Virtual Memory
Theo dõi Virtual Memory để làm gì?
Quan sát quá trình phân trang (paging) trong bộ nhớ ảo để xác định tình trạng hoán chuyển (swapping) bộ nhớ của các tiến trình. Đối với chương trình Java, việc hoán chuyển vùng nhớ Heap từ bộ nhớ (Memory/RAM) vào vùng nhớ ảo (Virtual Memory/HarDisk) sẽ làm giảm hiểu năng rất lớn, là do chức năng thu dọn bộ nhớ trong chương trình Java thường xuyên quét qua vùng nhớ Heap để xác định và thu hồi các đối tượng không còn sử dụng nữa. Nếu vùng nhớ Heap bị chia cắt, hoặc bị chuyển vào Virtual Memory thì quá trình thu dọn bộ nhớ sẽ thực hiện rất chậm. Chính vì vậy, chúng ta cần theo dõi các tiến trình Java để xác định xem có sự hoán chuyển bộ nhớ hay không, từ đó có các giải pháp điều chỉnh để tăng hiệu năng.
Công cụ theo dõi Virtual Memory
- vmstat (Solaris & Linux)
- prstat (Solaris)
- top (Linux)
- Performance Monitor (Windows)
- DTrace (Solaris)
- cpubar (Solaris – Performance Tools CD)
- meminfo (Solaris – Performance Tools CD)
Theo dõi pages in/out trong Solaris
Sử dụng công cụ vmstat, ta có thể theo dõi được các thông số pages in, pages out và page scan rate.
Khi hệ thống bắt đầu thực hiện hoán chuyển dữ liệu vào virtual memory, các giá trị page in, page out và scan rate đều tăng. Khi hệ thống thực hiện page in và page out mà không phát sinh hoạt động scan rate, hoặc có một số thay đổi scan rate nhỏ và sớm kết thúc, là được.
Theo dõi pages in/out trong Linux
Xử lý vấn đề Swapping Memory
Đối với ứng dụng Java, việc vùng nhớ Heap bị hoán chuyển vào Virtual Memory sẽ khiến hiệu năng chương trình giảm nghiêm trọng. Khi phát hiện hệ thống phải swapping memory nhiều, có thể xử lý bằng các cách sau:
- Phân tích và xác định và giảm kích thước phù hợp cho vùng Java Heap.
- Thêm dung lượng bộ nhớ vật lý (cắm thêm RAM).
- Giảm bớt số lượng ứng dụng đang chạy trên máy tính.
- Kết hợp các phương án trên.