Đo lường việc sử dụng tài nguyên UNIX, chúng ta cần dùng module resource trong chương trình. Module này cũng có thể kiểm soát việc sử dụng tài nguyên.
Để dùng module này, nên nhập bằng:
import resource
Giới hạn tài nguyên (Resource Limits)
Trong module này, ta có thể dùng setrlimit() để giới hạn sử dụng tài nguyên. Có hai tham số để giới hạn: soft limit (giới hạn mềm) và hard limit (giới hạn cứng). Soft limit là giới hạn hiện tại, có thể thay đổi trong quá trình chạy, nhưng không thể vượt quá hard limit. Hard limit có thể giảm xuống bất kỳ giá trị nào trên soft limit, nhưng không thể tăng lên.
Một số phương thức và hằng số liên quan đến giới hạn tài nguyên:
Phương thức resource.getrlimit(resource)
Trả về soft limit và hard limit dưới dạng tuple. Nếu tài nguyên chỉ định không hợp lệ, ném ValueError.
Phương thức resource.setrlimit(resource, limits)
Thiết lập giới hạn cho tài nguyên. Limits có thể gán dưới dạng tuple (soft, hard). Có thể dùng RLIM_INFINITY để làm tài nguyên không giới hạn.
Phương thức resource.prlimit(pid, resource[, limits])
Kết hợp của setrlimit() và getrlimit(). Có thể lấy và đặt giới hạn tài nguyên cùng lúc cho một tiến trình tùy ý. Khi pid = 0, hoạt động trên tiến trình hiện tại.
Một số hằng số liên quan đến Resource Limits:
| STT | Hằng số & Mô tả |
|---|---|
| 1 | RLIM_INFINITY – Giới hạn cho tài nguyên không giới hạn |
| 2 | RLIMIT_CORE – Kích thước tối đa file core do tiến trình hiện tại tạo |
| 3 | RLIMIT_CPU – Thời gian xử lý tối đa của bộ vi xử lý. Vượt giới hạn sẽ gửi tín hiệu SIGXCPU |
| 4 | RLIMIT_DATA – Kích thước tối đa heap của bộ vi xử lý |
| 5 | RLIMIT_STACK – Kích thước tối đa call stack. Dùng stack của main thread cho tiến trình đa luồng |
| 6 | RLIMIT_NOFILE – Số lượng file descriptor mở tối đa cho tiến trình hiện tại |
| 7 | RLIMIT_MEMLOCK – Không gian địa chỉ tối đa cho bộ nhớ khóa (locked memory) |
| 8 | RLIMIT_NICE – Trần mức nice của tiến trình |
| 9 | RLIMIT_SWAP – Kích thước tối đa swap space |
| 10 | RLIMIT_NTPS – Số lượng pseudo terminals tối đa trong hệ thống |
Sử dụng tài nguyên (Resource Usage)
Có các phương thức và hằng số liên quan đến sử dụng tài nguyên.
Phương thức resource.getrusage(who)
Trả về đối tượng được dùng bởi tiến trình hiện tại hoặc tiến trình con. Trả về nhiều trường. Từ các trường giá trị trả về, ta có thông tin về cách tài nguyên đã được sử dụng.
Phương thức resource.getpagesize()
Trả về số byte trong một trang hệ thống (system page). Có thể không giống kích thước trang vật lý.
Một số hằng số liên quan đến Resource Usage:
| STT | Hằng số & Mô tả |
|---|---|
| 1 | RUSAGE_SELF – Yêu cầu tài nguyên tiêu thụ bởi tiến trình gọi. Tổng tài nguyên của các thread |
| 2 | RUSAGE_CHILDREN – Yêu cầu tài nguyên tiêu thụ bởi tiến trình con |
| 3 | RUSAGE_BOTH – Yêu cầu tài nguyên bởi tiến trình gọi và tiến trình con. Không khả dụng trên mọi hệ thống |
| 4 | RUSAGE_THREAD – Sử dụng tài nguyên bởi luồng hiện tại. Không khả dụng trên mọi hệ thống |
Mã ví dụ
import resource
res_limits = resource.getrusage(resource.RUSAGE_SELF)
print(res_limits)
print('Kích thước trang: ' + str(resource.getpagesize()))
resource.setrlimit(resource.RLIMIT_CPU, (1, 2))
print('Giới hạn tài nguyên: ' + str(resource.getrlimit(resource.RLIMIT_CPU)))
for a in range(1000):
for b in range(1000):
for c in range(1000):
pass
Kết quả
$ python3 example.py resource.struct_rusage(ru_utime=0.035801, ru_stime=0.01074, ru_maxrss=9356, ru_ixrss=0, ru_idrss=0, ru_isrss=0, ru_minflt=1147, ru_majflt=0, ru_nswap=0, ru_inblock=0, ru_oublock=0, ru_msgsnd=0, ru_msgrcv=0, ru_nsignals=0, ru_nvcsw=0, ru_nivcsw=17) Kích thước trang: 4096 Giới hạn tài nguyên: (1, 2) CPU time limit exceeded (core dumped)