Lộn ruột Ubuntu Server P.1

Carla Schroder viết một loạt bài (than phiền về tài liệu, nói về kernel kernel) về Ubuntu 7.10 phiên bản dành cho server, trong đó có phân tích khá kỹ về kernel. Tôi dịch lại phần nói về kernel, có chỉnh sửa đôi chút cho dễ tiếp thu, tuy nhiên có một số khái niệm đòi hỏi kiến thức nền tảng về Hệ điều hành (có thể xem thêm ở phần Tài liệu tham khảo). Với những bài viết này, chúng ta sẽ có cái nhìn sâu sắc hơn về Ubuntu nói riêng và Hệ điều hành nói chung.

Giới thiệu

Carla Schroder là một nhà nghiên cứu, một cây bút nữ tích cực. Cuốn sách nổi tiếng của bà được nhiều Linuxer tìm đọc, Linux Cookbook, O’Reilly xuất bản. Lần đầu tiên bà đặt tay lên máy tính là sinh nhật thứ 37. Với châm ngôn sống “you’re never too old to try something new“, bà tự học, nghiên cứu Linux và Windows cho đến bây giờ. Thông tin về bà xem thêm ở đây.

Tìm hiểu của Carla Schroder về Ubuntu Server kernel dựa trên so sánh sự khác nhau giữa file config kernel dành cho bản desktop (config-2.6.22-14-generic) và file dành cho server (config-2.6.22-14-server) để tìm ra quan điểm của Ubuntu về kernel dành cho máy chủ. Sự khác biệt giữa hai bản kernel là không lớn lắm nhưng kết quả đưa ra cũng giúp ta học được nhiều điều. Sau đây là những đặc điểm được Carla Schroder phân tích.

I/O Scheduler

Có bốn cơ chế định thời I/O khác nhau: CFQ (Completely Fair Queuing), Deadline, NOOP và Anticipatory. Ubuntu dùng cơ chế CFQ là mặc định cho kernel của desktop, và Deadline dành cho kernel của server. Mục đích của các cơ chế này đều như nhau: tối ưu hoá băng thông đĩa cứng cho nhiều loại tải (workload) khác nhau. Trong file cấu hình kernel thì lựa chọn này tương ứng với CONFIG_DEFAULT_IOSCHED, cùng với bốn tùy chọn CONFIG_IOSCHED_CFQ, _DEADLINE, _AS, _NOOP.

  • CFQ cố gắng cân bằng những yêu cầu đọc/ghi ngang nhau.
  • Deadline gán độ ưu tiên cao hơn cho những yêu cầu đọc, và thường xuyên thực hiện việc sắp xếp lại thứ tự của các yêu cầu đọc/ghi để đạt được mục tiêu đáp ứng hoàn tất những yêu cầu đọc trong một thời gian xác định, mà không phải “bỏ đói” những yêu cầu ghi. Nghĩa là với nhu cầu đọc thì có deadline (khoảng thời gian xác định phải đáp ứng) còn nhu cầu ghi thì không có deadline.
  • Anticipatory giúp làm giảm thời gian trễ (latency) bằng cách gán độ ưu tiên cho những ứng dụng đang chạy. Điều này được xem là phù hợp với những hệ thống nhỏ hơn, với một hay hai ổ cứng, và các bộ xử lý lõi đơn hoặc lõi kép.
  • NOOP là một bộ định thời tối thiểu hoádành cho những hệthống có thiết bị phần cứng xử lý định thời I/O, như các SCSI RAID array lớn.

Câu hỏi đặt ra, sử dụng cơ chế nào cho phù hợp, thì còn tùy thuộc vào hệ thống của bạn và cách bạn sử dụng hệ thống: bao nhiêu CPU, bao nhiêu ổ cứng và bộ điều khiển (controller), các loại trình ứng dụng, và tải mà những hệ thống phải xử lý. Bạn có thể chạy những đo lường so sánh (benchmark), và dựa vào đó điều chỉnh hệ thống của mình. Bạn có thể đưa những tuỳ chọn định thời vào dưới dạng những tuỳ chọn khi khởi động kernel, hoặc thậm chí bạn có thể kích hoạt nhiều bộ định thời khác nhau cho mỗi thiết bị khối (block device) và thay đổi chúng on-the-fly (xem Tài liệu tham khảo). Những lựa chọn mặc định của Ubuntu là điểm khởi đầu tốt, và bạn có thể thay đổi những thiết lập đó nếu muốn, như trên bất kỳ hệ thống Linux nào.

Preemption (cơ chế đoạt quyền thực thi)

Kernel của server không kích hoạt cơ chế preemption (CONFIG_PREEMPT_NONE=y), trong khi kernel của desktop lại mở cơ chế này (CONFIG_PREEMPT_BKL=y, CONFIG_PREEMPT_VOLUNTARY=y). Cơ chế preemption làm việc chung với cơ chế định thời để tinh chỉnh hiệu năng (performance), hiệu suất (efficiency), và tính đáp ứng (responsiveness). Trong những kernel không có preemptive, kernel code chạy đến khi hoàn tất; bộ định thời không thể đụng vào nó cho đến khi nó kết thúc. Nhưng Linux kernel cho phép những tác vụ có thể được ngắt ở hầu như bất kỳ thời điểm nào (nhưng những khi không an toàn thì không được), để cho những tác vụ có độ ưu tiên cao hơn có thể nhảy lên đầu hàng đợi.

Cơ chế này phù hợp cho những hệ thống desktop vì người dùng thường làm nhiều việc trong cùng một lúc, như: viết tài liệu, nghe nhạc, duyệt Web, download, … Người dùng không cần biết những ứng dụng ở bên dưới đáp ứng như thế nào, mà chỉ quan tâm đến những chương trình mà họ đang sử dụng; vì vậy nếu việc tải một trang web mất nhiều thời gian hơn là viết một email, đó có thể là một sự đánh đổi chấp nhận được. Hiệu năng và hiệu suất của toàn hệ thống thực ra là bị giảm đi, nhưng theo một cách không làm cho người dùng phải bận tâm.

Trên những máy chủ thì bạn lại muốn tối thiểu hoá mọi thứ ảnh hưởng đến hiệu năng, vì vậy tắt cơ chế preemption thường là nguyên tắc đúng đắn.

Memory

Kernel dành cho server 32-bit hỗ trợ đến 64 GB bộ nhớ; trong khi kernel dành cho desktop chỉ là 4 GB (CONFIG_HIGHMEM64G=y, CONFIG_HIGHMEM4G=y). Bạn sẽ chỉ thấy những tùy chọn này ở kernel 32-bit, vì không gian địa chỉ 32-bit chỉ đủ lớn để hỗ trợ đến 4 GB khi không có sự can thiệp nào. Nếu bạn muốn sự can thiệp của công nghệ thì sử dụng chế độ PAE (Physical Address Extension) của Intel . Linux có hỗ trợ PAE, và CPU của bạn cũng cần phải hỗ trợ PAE. Bất kỳ loại CPU nào mới hơn Pentium Pro hay AMD K6-3 cũng có hỗ trợ. Trên một hệ thống 64-bit thì bạn sẽ không thấy bất kỳ tùy chọn bộ nhớ nào vì không cần thiết phải sửa đổi để vượt qua sự thiếu thốn không gian địa chỉ bộ nhớ; bạn sẽ vẫn cảm thấy thoải mái cho đến khi nhu cầu của bạn vượt qua 16 exabytes RAM (10^18 bytes).

Ticks và HZ

Cả hai kernel đều hỗ trợ bộ đếm ngắt theo nhu cầu (on-demand interrupt timers) (CONFIG_NO_HZ=y), hay còn được gọi là tùy chọn “tickless”. Thuật ngữ này có nghĩa là trong những khoảng thời gian không có hoạt động, hệ thống sẽ ở trạng thái hoàn toàn rảnh rỗi, cho phép tiết kiệm năng lượng và làm mát.

Kernel của server được thiết lập một bộ đếm ngắt 100 Hz (CONFIG_HZ=100, CONFIG_HZ_100=y), có nghĩa là nó nhận 100 ngắt mỗi giây. Một cách nhìn khác là kernel sẽ kiểm tra ngắt 100 lần mỗi giây để xem có việc gì làm không. Kernel của desktop được thiết lập ở mức 250 Hz; con số Hz càng thấp tương đương với chi phí (overhead) càng thấp và độ trễ (latency) càng cao, và ngược lại. Số Hz cao hơn nghĩa là hệ thống có tính đáp ứng cao hơn, với một cái giá phải trả cho việc sử dụng CPU ở mức cao hơn. Một số tiến trình yêu cầu nhiều ngắt hơn; ví dụ, những máy chủ xử lý video và VoIP cần đến 1000Hz. Nếu bạn muốn thay đổi giá trị Hz này thì cần phải biên dịch lại kernel.

 

Lộn ruột Ubuntu Server P.2

Tài liệu tham khảo

Đông Thao

About dongthao

The best things in life, they are free ... (Cry on my shoulder lyric)
This entry was posted in Hệ điều hành, kernel, Linux, Linux Tutorial. Bookmark the permalink.

Có 5 phản hồi tại Lộn ruột Ubuntu Server P.1

  1. VietWOW nói:

    Quá hay, bác cố gắng dịch & biên tập mấy bài này nhiều vào cho anh em thảo khảo nhé ^_^

    Thanx

  2. htr3n nói:

    Lúc trước trong blog mình có để dự định viết bài so sánh giữa hai version, chủ yếu thiên về hệ điều hành để hiểu rõ thêm về kernel, riết rồi bận bịu quá quên lun. Giờ có bài của Carla, cool thật. Có điều Carla than phiền về documentation cho phiên bản Server thì hơi lạ. Đa số các open-source ware đều không mạnh về documentation. Dân NIX admin thì mấy ai đòi hỏi documentation kiểu Carla thế. Mỗi tool đều có trang support và documentation riêng. Các phiên bản customized trên Ubuntu cũng không có khác gì nhiều, chủ yếu là ở cấu hình khi build và vị trí file, cứ dpkg-* là ra rồi, hơi sức đâu mà dựa vào default configuration rồi quay ra complain như Carla nhỉ? Kiểu complain đó dành cho Desktop End-Users thì hợp lý hơn, nhưng mà phiên bản Desktop thì lại khá ổn về cấu hình mặc định, nhận dạng phần cứng cũng tốt, customized cho mobile cũng ổn. Chỉ có một cái trục trặc trên Ubuntu (thực chất là trục trặc trong kernel 2.6) mà mình đã gặp là đụng độ khi có Card Reader nối vào usb internal. Ubuntu khởi động không được, đứng đơ ra. Cái này thì mình biết là do ACPI nhưng chưa tìm ra cách nào giải quyết tốt hơn là acpi=off (khổ cái khi tắt acpi thì shutdown phải tự tắt máy như lúc còn dùng main AT, potay.com)

  3. livechung.wordpress.com nói:

    Preemption mà dịch là “đoạt quyền thực thi” thì nghe ghê quá. Nên nói là “độ ưu tiên” thì hay hơn.
    Có một điều tui chả hiểu tại sao phải tắt preemtion khi chạy cho server cả. Nếu chạy theo kiểu round-robin thì mọi tác vụ xếp hàng như nhau thì mấy service sẽ không có độ ưu tiên để đáp ứng. Vì thế nếu tắt preemption đáng lẽ sẽ làm cho server giảm tính đáp ứng hơn. Cũng có thể nói server lúc này sẽ giảm hiệu năng chứ đâu tăng như bạn nói.

  4. htr3n nói:

    IMO, preemption theo nghĩa đen thì là “tiên hạ thủ vi cường”😉. Trong ngữ cảnh của hệ điều hành thì mình nghĩ dịch ra thành “đoạt quyền thực thi” là ổn so với ngữ nghĩa của nó. Tham khảo thêm ở Wikipedia hoặc các tài liệu về OS như “Operating System Concepts” của S. Galvin hoặc “Modern OS” của A. Tannenbaum.
    Độ ưu tiên (priority) chỉ là một trong nhiều cách thực hiện preemption nên bản chất không phải là preemption.
    Với Desktop version thiên về tương tác với end-user nên có nhiều I/O delay khi chờ user tương tác qua bàn phím, chuột. Preemption là cần thiết để chuyển quyền thực thi cho process khác thay vì phải chờ đợi I/O. Còn Server chủ yếu là thực thi background, ít hoặc hầu như không có tương tác nhiều với user -> không cần thiết dùng preemption. Hơn nữa, với server thì responsiveness không quan trọng bằng performance (throughput) nên tắt preemption ở kernel mode sẽ khử đi overhead của chuyển ngữ cảnh và race condition ở kernel mode.

  5. htr3n nói:

    Mình xin giải thích thêm một chút ý của mình ở trên: vì có preemption ở kernel nên sẽ xảy ra race condition. Vậy overhead bao gồm chuyển ngữ cảnh (context switching) và mutual exclusion (để giải quyết race condition). Chi phí này sẽ giảm đi khi tắt preemption.
    Throughput là đại lượng chỉ lượng jobs hoàn tất hoặc lượng yêu cầu các OS functions/services (đọc đĩa, ghi đĩa,…) hoàn tất. Các OS functions thì phải thực thi ở kernel mode. Do đó, tắt preemption ở kernel mode -> OS functions không bị ngắt ngang nhiều -> hoàn thành nhanh hơn -> tăng throughput.

    Có gì sai thì mong các bạn trao đổi thêm😉

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s