19/09/2018, 09:50

Làm thế nào để hạn chế tài nguyên bằng cách sử dụng cgroups trên CentOS 6

Giới thiệu Các nhóm điều khiển, hoặc các nhóm, là một tính năng hạt nhân được giới thiệu trong CentOS 6 để cung cấp một cách mới hạn chế quyền truy cập vào các tài nguyên hệ thống cho các quy trình. Bạn có thể tạo các nhóm riêng của bạn, theo dõi các nhóm bạn cấu hình, từ chối truy cập vào các ...

Giới thiệu

Các nhóm điều khiển, hoặc các nhóm, là một tính năng hạt nhân được giới thiệu trong CentOS 6 để cung cấp một cách mới hạn chế quyền truy cập vào các tài nguyên hệ thống cho các quy trình. Bạn có thể tạo các nhóm riêng của bạn, theo dõi các nhóm bạn cấu hình, từ chối truy cập vào các nhóm cgroups, và thậm chí cấu hình lại các nhóm của bạn một cách động trên một hệ thống đang chạy.

Trong hướng dẫn này, chúng ta sẽ thấy làm thế nào để giới hạn CPU, bộ nhớ và đĩa i / o cho các tiến trình. Để đạt được điều này, trước tiên chúng tôi sẽ tạo một số nhóm kiểm soát, thêm quy trình cho họ và xem cách họ thực hiện.

Điều kiện tiên quyết

Trước khi bắt đầu với hướng dẫn này, bạn nên có một người dùng không phải root với thiết lập sudo trên CentOS 6 Droplet của bạn. Để thiết lập người dùng thuộc loại này, hãy làm theo Thiết lập máy chủ ban đầu với CentOS 6 hướng dẫn. Tất cả các lệnh sẽ được chạy như người dùng này.

Bước 1 - Cài đặt

Trong phần này, chúng tôi sẽ cài đặt các gói cần thiết cho cgroups để hoạt động.

Các nhóm điều khiển và các hệ thống con mà chúng liên quan có thể được điều khiển bằng cách sử dụng các lệnh và tiện ích của trình bao. Tuy nhiên, cách dễ nhất để làm việc với cgroups là cài đặt libcgroup gói. Các libcgroup gói cung cấp các tiện ích dòng lệnh liên quan đến cgroups, các tệp cấu hình và các trang của người dùng. Gói này không được cài đặt theo mặc định trên máy chủ CentOS 6. Để cài đặt nó, hãy chạy lệnh sau:

sudo yum install libcgroup

Bước 2 - Khởi động dịch vụ

Các cgconfig(dịch vụ cấu hình nhóm điều khiển) được sử dụng để tạo các nhóm và quản lý các hệ thống phụ. Nó có thể được cấu hình để khởi động lúc khởi động và thiết lập lại các nhóm được xác định trước của bạn, do đó làm cho chúng liên tục trên các lần khởi động lại. Các cgconfig dịch vụ không được khởi động theo mặc định trên CentOS 6, vì vậy chúng ta hãy bắt đầu nó:

sudo service cgconfig start

Bắt đầu từ cgconfig dịch vụ tạo hệ thống tệp ảo được gắn kết tại /cgroup với tất cả các hệ thống con. Hãy để chúng tôi xác minh điều này:

sudo ls /cgroup

Lệnh này sẽ hiển thị các hệ thống con sau:

blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

Bạn cũng có thể chạy lệnh `lscgroup 'để kiểm tra:

sudo lscgroup

Bạn sẽ thấy các hệ thống con trong bố cục hơi khác:

cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/

Tài nguyên hệ thống

Các tài nguyên hệ thống được gọi là các hệ thống phụ, và mỗi hệ thống con có một số tham số mà chúng ta có thể gán các giá trị. CentOS 6 cung cấp mười hệ thống con cgroup:

  • blkio â € "hệ thống con này đặt giới hạn truy cập vào / ra đến và từ các thiết bị khối như ổ đĩa vật lý (đĩa, trạng thái rắn, USB, v.v.).
  • CPU â € "hệ thống con này đặt giới hạn về thời gian CPU có sẵn
  • cpuacct â € "hệ thống con này tạo ra các báo cáo tự động về tài nguyên CPU được sử dụng bởi các tác vụ trong một nhóm
  • cpuset - Hệ thống con này gán các CPU riêng lẻ (trên một hệ thống đa lõi) và các nút bộ nhớ cho các tác vụ trong một nhóm
  • thiết bị - Hệ thống con này cho phép hoặc từ chối truy cập vào các thiết bị bằng các tác vụ trong một nhóm
  • tủ đông â € "hệ thống con này tạm ngưng hoặc tiếp tục công việc trong một nhóm
  • ký ức â € "hệ thống con này đặt giới hạn sử dụng bộ nhớ của các tác vụ trong một nhóm và tạo ra các báo cáo tự động về tài nguyên bộ nhớ được sử dụng bởi các tác vụ đó
  • net_cls “Hệ thống con này gắn thẻ các gói mạng với một định danh lớp (classid) cho phép bộ điều khiển lưu lượng Linux (tc) xác định các gói có nguồn gốc từ một tác vụ nhóm cụ thể
  • net_prio - Hệ thống con này cung cấp một cách tự động thiết lập mức ưu tiên của lưu lượng mạng cho mỗi giao diện mạng
  • ns - đây là hệ thống con không gian tên

Bước 3 - Cấu hình

Trong phần này, chúng ta sẽ tạo các nhóm cgroups và thiết lập một số giới hạn tài nguyên cho các nhóm này. Tệp cấu hình cgroup là /etc/cgconfig.conf. Tùy thuộc vào nội dung của tệp cấu hình, cgconfig có thể tạo cấu trúc phân cấp, gắn kết các hệ thống tệp cần thiết, tạo nhóm cgroup và đặt tham số hệ thống con (giới hạn tài nguyên) cho mỗi nhóm.

Một hệ thống phân cấp là một tập hợp các nhóm được sắp xếp trong một cây, sao cho mọi nhiệm vụ trong hệ thống nằm trong chính xác một trong các nhóm trong hệ thống phân cấp. Trong cấu hình CentOS 6 mặc định, mỗi hệ thống con được đưa vào hệ thống phân cấp riêng của nó.

Trước tiên, chúng ta hãy tạo một vài nhóm có tên là limitcpu, limitmem, limitio và các trình duyệt. Các /etc/cgconfig.conf tệp chứa hai loại mục nhập chính â € ” mount và group. Các dòng bắt đầu bằng group tạo các nhóm và thiết lập các tham số hệ thống con. Chỉnh sửa tệp /etc/cgconfig.conf và thêm các mục nhóm cgroup sau ở dưới cùng:

/etc/cgconfig.conf

group limitcpu{
        cpu {
                cpu.shares = 400;
        }
}

group limitmem{
        memory {
                memory.limit_in_bytes = 512m;
        }
}

group limitio{
        blkio {
                blkio.throttle.read_bps_device = "252:0         2097152";
        }
}

group browsers{
        cpu {
                cpu.shares = 200;
        }
        memory {
                memory.limit_in_bytes = 128m;
        }
}
  • bên trong limitcpu cgroup, chúng tôi đang giới hạn các cổ phiếu cpu có sẵn cho các quy trình trong nhóm này đến 400. cpu.shares xác định tỷ lệ tương đối của thời gian CPU có sẵn cho các tác vụ trong nhóm.
  • bên trong limitmem cgroup, chúng tôi đang hạn chế bộ nhớ có sẵn cho các quy trình cgroup tới 512MB.
  • bên trong limitio cgroup, chúng tôi đang hạn chế thông lượng đọc đĩa đến 2MiB / s. Ở đây chúng tôi đang hạn chế đọc I / O vào đĩa chính, / dev / vda, với chính: số nhỏ 252: 0 và 2MiB / s được chuyển đổi thành byte mỗi giây (2x1024x1024 = 2097152).
  • bên trong browsers cgroup, chúng tôi đang giới hạn số lượng cổ phiếu cpu xuống còn 200 và bộ nhớ khả dụng là 128MB.

Chúng ta cần phải khởi động lại cgconfig dịch vụ cho những thay đổi trong /etc/cgconfig.conf tệp có hiệu lực:

sudo service cgconfig restart

Hãy để chúng tôi kích hoạt cgconfig để bắt đầu khởi động hệ thống. Khi bạn bật dịch vụ bằng chkconfig, nó sẽ đọc tệp cấu hình cgroup /etc/cgconfig.conf lúc khởi động. cgroups được tạo lại từ phiên này sang phiên khác và duy trì liên tục.

sudo chkconfig cgconfig on

Tiếp theo, xác minh các nhóm chúng tôi đã cấu hình được hiển thị chính xác:

lscgroup 

Nếu mọi thứ suôn sẻ, bạn sẽ thấy:

cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio

Mục tiêu tiếp theo của chúng tôi là thêm các quy trình (nhiệm vụ) mà chúng tôi muốn giới hạn tài nguyên cho các nhóm mà chúng tôi đã tạo trước đó.

Cgred (daemon quy tắc nhóm điều khiển động cơ) là một dịch vụ di chuyển các nhiệm vụ thành các nhóm theo các tham số được thiết lập trong /etc/cgrules.conf tập tin. Các mục nhập trong /etc/cgrules.conf tệp có thể có một trong hai dạng:

user subsystems control_group

hoặc là

user:command subsystems control_group

user đề cập đến tên người dùng hoặc tên nhóm được đặt trước bằng ký tự "@". subsystems tham khảo danh sách các tên hệ thống con được phân cách bằng dấu phẩy. control_group đại diện cho một đường dẫn đến nhóm, và command là viết tắt của một tên tiến trình hoặc một đường dẫn lệnh đầy đủ của một tiến trình. Các mục nhập trong /etc/cgrules.conf tệp có thể bao gồm các ký hiệu bổ sung sau:

  • @ â € "cho biết một nhóm thay vì một người dùng cá nhân. Ví dụ, @admin cho biết tất cả người dùng trong nhóm quản trị.
  • * â € "đại diện cho" tất cả ". Ví dụ, * trong trường người dùng đại diện cho tất cả người dùng.
  • % â € "đại diện cho một mục giống như mục trong dòng ở trên.

Bây giờ chúng ta hãy thêm các chương trình / quy trình mà chúng ta muốn giới hạn. Chỉnh sửa /etc/cgrules.conf và thêm thông tin sau ở dưới cùng:

/etc/cgrules.conf

*:firefox       cpu,memory      browsers/
*:hdparm        blkio   limitio/
sammy   blkio   limitio/
@admin:memhog  memory  limitmem/
*:cpuhog        cpu     limitcpu/

Trong các dòng trên, chúng tôi đang thiết lập các quy tắc sau:

  • firefox các quy trình được chạy bởi bất kỳ người dùng nào sẽ được tự động thêm vào browsers cgroup và giới hạn trong các hệ thống con CPU và bộ nhớ.
  • hdparm các quy trình được chạy bởi bất kỳ người dùng nào sẽ được thêm vào limitio cgroup và sẽ bị giới hạn trong hệ thống con blkio theo các giá trị tham số được chỉ định trong nhóm đó.
  • Tất cả các quy trình do người dùng điều hành sammy sẽ được thêm vào limitio cgroup và giới hạn trong hệ thống con blkio.
  • con nhím các quy trình được thực hiện bởi bất kỳ ai trong admin nhóm sẽ được thêm vào nhóm limitmem và giới hạn trong hệ thống con bộ nhớ.
  • cpuhog các quy trình được chạy bởi bất kỳ người dùng nào sẽ được thêm vào nhóm limitcpu và giới hạn trong hệ thống con CPU.

Chúng ta cần bắt đầu cgred dịch vụ cho các thay đổi cấu hình cgrules có hiệu lực, làm điều này bằng cách sử dụng lệnh:

sudo service cgred start

Chúng tôi cũng cần đảm bảo cgred dịch vụ được kích hoạt để bắt đầu khởi động hệ thống để các quy tắc của chúng tôi tồn tại trong quá trình khởi động lại:

sudo chkconfig cgred on

Chú thích: Đối với các dịch vụ hỗ trợ sysconfig, bạn có thể thêm biến CGROUP_DAEMON="subsystem:control_group" trong /etc/sysconfig/servicename thay vì chỉnh sửa cgrules.conf tập tin. Ví dụ: đối với một dịch vụ như httpd, bạn có thể thêm CGROUP_DAEMON="blkio:/limitio"
vào tập tin /etc/sysconfig/httpd.conf để thêm các quy trình httpd vào limitio cgroup.

Bước 4 - Thử nghiệm

Trong bước này, chúng tôi sẽ xác minh rằng giới hạn thông lượng đọc đĩa của 2MiB / s được thực thi đúng theo quy tắc chúng tôi đã thêm vào cgrules.conf. Để làm điều này, chúng tôi sẽ cài đặt và chạy hdparm dụng cụ. Các hdparm công cụ có thể thiết lập và xem các thông số phần cứng của ổ đĩa cứng, đo tốc độ đọc và ghi, vv Hãy để chúng tôi cài đặt hdparm bằng cách sử dụng:

sudo yum install hdparm

Bây giờ, chúng ta hãy chạy một lệnh để đo tốc độ đọc của đĩa cứng / dev / vda của bạn:

sudo hdparm --direct -t /dev/vda

Bạn sẽ thấy kết quả sau:

/dev/vda:
 Timing O_DIRECT disk reads:   6 MB in  3.00 seconds =   2.00 MB/sec

Đầu ra cho thấy thông lượng đọc đĩa là 2MB / s. Nếu bạn dừng cả hai cgconfig và cgred dịch vụ và chạy hdparm lệnh trên một lần nữa, bạn có thể thấy tốc độ đọc ban đầu / mặc định từ khi các quy tắc cgroup không được triển khai.

Phần kết luận

Hướng dẫn này chỉ giới thiệu một số điều cơ bản bạn có thể làm với các nhóm. Cũng có thể tạo các nhóm con, đếm và báo cáo số lượng tài nguyên được tiêu thụ bởi một nhóm, tạm dừng một nhóm các quy trình bằng cách sử dụng tủ đông hệ thống con và hơn thế nữa.

Xem các tài nguyên sau để biết thêm chi tiết:

  • Một số trường hợp sử dụng nâng cao cho cgroups
  • Danh sách tất cả các tham số hệ thống con và định nghĩa của chúng
  • Thông tin thêm về phân cấp cgroup
  • Thậm chí nhiều thông tin hơn về phân cấp cgroup
0