Hành vi mặc định của 'tốt đẹp' là điều chỉnh mức độ ưu tiên của 'io' của ứng dụng khi độ đẹp thay đổi.
Tất cả mọi thứ tất nhiên phụ thuộc vào khối lượng công việc của bạn, nhưng một trong những khía cạnh quan trọng của bất kỳ hệ điều hành nào là cách phân bổ tài nguyên của nó và cách nó xử lý sự tranh chấp .
Điều thực sự quan trọng là phải hiểu những gì độc đáo làm bởi vì khi chịu tải từ các quy trình cạnh tranh, cách thức hoạt động của hệ điều hành có thể có tác động đến phần còn lại của khối lượng công việc của bạn.
Sự tham gia là thước đo cách các ứng dụng khác nhau cạnh tranh cho cùng một tài nguyên (như CPU).
Xử lý tải
Kể từ khi bộ lập lịch hoàn toàn công bằng được giới thiệu, Nice chỉ đơn thuần là tiền đề cho mệnh đề 'trọng số' của mỗi quy trình. Mà có thể được xem trong Proc.
$ cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight : 1024
...
Thay đổi sự độc đáo chỉ làm thay đổi trọng lượng:
$ nice -n 5 cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight : 335
...
Các biện pháp cho sự tranh chấp CPU được thực hiện bằng thuật toán lập lịch hoàn toàn công bằng. Mỗi ứng dụng được gán một giá trị 'trọng số' và trong trường hợp tranh chấp thời gian của CPU thì thời gian được phân chia giữa các quy trình bằng cách tổng tất cả quá trình xử lý theo thời gian của CPU và gán cho chúng thời gian CPU có mệnh giá chung thấp nhất dựa trên giá trị trọng lượng của chúng.
Nếu tôi có 3 ứng dụng tất cả đều muốn sử dụng thời gian CPU, theo mặc định, chúng nhận được 1024 như trọng lượng bình thường. Nếu tôi có một quy trình với +5 như trên, thì cả ba trọng số sẽ được tổng cộng là 2383, do đó, quy trình được xử lý sẽ nhận được khoảng 15% thời gian cpu trong một giây nhất định nếu cả 3 quy trình đều yêu cầu CPU trong giây đó .
Tại sao cần phải có ưu tiên CPU và IO khác nhau?
Tính duy nhất thực sự chỉ là chơi với những gì cần làm khi hệ thống đang tải, nghĩa là - cách hệ điều hành cắt giảm thời gian giữa các quy trình cạnh tranh như được xác định bởi bất kỳ yếu tố nào là cần thiết.
Làm thế nào điều này ảnh hưởng đến bạn hoặc có liên quan đến bạn bị ràng buộc bởi những gì mà các ứng dụng khác nhau cung cấp cho nhau và thời gian để phân phối mỗi ứng dụng nên có.
Tính độc đáo thực sự chỉ làm một cái gì đó khi hệ thống của bạn đang tải (có nhiều thứ muốn chú ý hơn CPU hoặc Đĩa có thể xử lý). Nó chỉ hướng dẫn kernel cách phân bổ tài nguyên trong những trường hợp đó.
Có bất kỳ cách sử dụng trong thế giới thực để có chúng khác nhau?
Nếu bạn có nhiều quy trình cạnh tranh hoặc công việc phải hoàn thành mà CPU có thể thực hiện nhiều hơn, tính tốt sẽ mang đến cho bạn một số đảm bảo tương đối ổn định về những gì công việc hoàn thành trước. Điều này có thể quan trọng với bạn nếu bạn nói rằng việc tạo ra một báo cáo sẽ được gửi trước khi một báo cáo khác kết thúc.
Trên một hệ thống máy tính để bàn, tính độc đáo có thể còn quan trọng hơn. Một số ứng dụng có hành vi thời gian thực, theo đó chúng được đánh thức thường xuyên hơn trong quá trình tải sẽ ngăn dữ liệu bị cũ. Pulseaudio rơi vào thể loại này chẳng hạn.
Các ứng dụng khác có thể được yêu cầu để xử lý công việc cho các ứng dụng phụ thuộc. Ví dụ, rất nhiều yêu cầu apache để nói rằng một máy chủ SQL như MySQL có thể bị chặn trong một thời gian dài vì SQL không phục vụ đủ nhanh vì - giả sử một số báo cáo khác đang cạnh tranh về thời gian của CPU. Vì vậy, không chỉ SQL bị đình trệ mà Apache cũng vậy. Đôi khi SQL có thể bị tổn thương vì thường có các luồng công nhân ít hơn nhiều so với các luồng apache cạnh tranh như một nhóm được cân nhắc thuận lợi hơn bởi bộ lập lịch, do đó, việc dành nhiều thời gian CPU hơn cho SQL sẽ giúp mọi thứ tăng lên.
UpdateDB (một chương trình lập chỉ mục các tệp) chạy muộn vào ban đêm và rất nặng đĩa. Có thể hữu ích để giảm mức ưu tiên lập lịch IO của nó để các ứng dụng khác tại thời điểm đó được ưu tiên hơn thứ gì đó không quan trọng theo thứ tự.
Những trường hợp sử dụng trong thế giới thực nào bạn thấy cần có mức độ ưu tiên CPU và IO khác nhau?
Rất ít. Sự tốt đẹp là quá nhiều của một cách tiếp cận nỗ lực tốt nhất. Theo nguyên tắc thông thường, tôi ít quan tâm đến việc các ứng dụng hoạt động tốt như thế nào và nhiều hơn về mức độ chúng có thể hoạt động kém như thế nào . Điều này thoạt nghe có vẻ lạc hậu nhưng tôi có đảm bảo cung cấp dịch vụ để đáp ứng điều quan trọng hơn đối với tôi.
Tôi muốn tự tin nói rằng "công cụ của bạn ngay cả trong một ngày tồi tệ sẽ được thực hiện trong khoảng thời gian X". Nếu nó đi nhanh hơn, nó chỉ là một phần thưởng.
Tôi thường sẽ bắt đầu bằng cách tạo ra các thông số kỹ thuật đã thỏa thuận, chẳng hạn như:
- Tất cả các ứng dụng web được đảm bảo để hoàn thành các yêu cầu trong 0,3 giây.
- Tất cả các yêu cầu SQL trên một hệ thống được đảm bảo hoàn thành trong 0,1 giây.
- Ứng dụng web sẽ xử lý không quá 50 IOPS và cung cấp các tệp 1k.
- Tổng dung lượng bộ nhớ ứng dụng web không cao hơn 250Mb.
Và rút ra các yêu cầu để đáp ứng như:
- Tất cả các yêu cầu web phải được hoàn thành trong 0,05 giây.
- Tất cả các yêu cầu SQL phải được hoàn thành trong 0,02 giây.
- Cần có đủ bộ nhớ xử lý tất cả các yêu cầu.
- Yêu cầu IO phải được đáp ứng.
Cung cấp thông số kỹ thuật là đúng, sau đó tôi đáp ứng các mục tiêu này mà không cần thực hiện ảo hóa, sử dụng phương pháp tiếp cận hiệu quả hơn nhiều của các nhóm kiểm soát.
Các nhóm kiểm soát cho phép tôi thực hiện các đảm bảo mức dịch vụ khá đáng tin cậy để phân bổ tài nguyên, cung cấp cho ứng dụng hoạt động trong các ranh giới được chỉ định. Điều này có nghĩa là ngay cả trên một hệ thống đang tải, tôi có thể đảm bảo tính sẵn có của tài nguyên cho ứng dụng đang được đề cập và đảm bảo không gian cho các ứng dụng khác trên cùng một hộp!
Nếu chúng tôi lấy ví dụ về CPU và IO của bạn. Tôi thiết lập các giới hạn đáp ứng các yêu cầu đó:
# cd /sys/fs/cgroup/blkio/apache
# echo "253:0 100" >blkio.throttle.read_iops_device
# echo "253:0 50" >blkio.throttle.write_iops_device
# echo "253:0 102400" >blkio.throttle.read_bps_device
Vì vậy, 100k byte để đọc 100 iops.
# cd /sys/fs/cgroup/cpu/apache
# echo 1000000 >cpu.cfs_period_us
# echo 60000 >cpu.cfs_quota_us
Trong khoảng thời gian 1 giây, cung cấp 0,06 giây CPU.
# cd /sys/fs/cgroup/cpu/sql
# echo 1000000 >cpu.cfs_period_us
# echo 20000 >cpu.cfs_quota_us
Trong khoảng thời gian 1 giây, cung cấp 0,02 giây CPU.
Việc cung cấp các nhóm cạnh tranh khác không làm điều gì ngớ ngẩn, việc bị tải ít hơn là một yếu tố trong việc cung cấp dịch vụ của tôi vì tôi biết CPU bị ném như thế nào cho mỗi ứng dụng.
Các nhóm kiểm soát có tính chất này vẫn là nỗ lực tốt nhất nhưng họ cung cấp khả năng kiểm soát nhiều hơn đối với nỗ lực đó hơn là tính độc đáo và tính ion.