Dùng LXC container để giới hạn tài nguyên tính toán - blkio (phần 2)
LXC
3
Linux
77
White

Bùi Hồng Hà viết ngày 11/08/2015

Giới thiệu

Trong phần 1, mình đã giới thiệu qua cách cài đặt và chạy một container sử dụng lxc. Trong phần 2 này, mình sẽ tập trung viết về cách giới hạn tài nguyên tính toán sử dụng cgroup. Do tài nguyên có thể là cpu, memory, I/O nên bài viết này chỉ tập trung vào subsystem blkio (I/O). Các subsystem còn lại sẽ được giới thiệu vào các bài viết sau.

Giới hạn tài nguyên I/O dùng cgroup

blkio (viết tắt của block I/O) là subsystem giám sát và thiết lập các giới hạn vào I/O. Truy cập I/O bao gồm 2 thao tác cơ bản:

  • Đọc dữ liệu từ đĩa cứng.
  • Ghi dữ liệu vào đĩa cứng.

Bằng cách ghi giá trị mong muốn vào file đại diện cho thiết bị, ta có thể giới hạn được truy cập, thông lượng. Đọc giá trị từ những file này cung cấp cho ta thông tin về các thao tác I/O của container.

blkio cung cấp 2 chính sách (policy) điều chỉnh truy cập đến I/O.

  • Proportional weight division: phân chia tài nguyên theo tỉ lệ. Chính sách phân chia tài nguyên này được cài đặt sử dụng Completely Fair Queueing I/O scheduler (lập lịch hoàn toàn công bằng?). Chinh sách này cho phép cài đặt phần trăm sử dụng các thao tác I/O bằng tỉ lệ giữa các containers.
  • I/O Throttling: chính sách này cho phép cài giới hạn trên cho các thao tác I/O thực hiện trên 1 device cụ thể. Việc này có nghĩa là hệ thống có thể giới hạn I/O cho 1 đĩa cứng nhất định.

Proportional weight division.

Các biến

Biến số ý nghĩa Ví dụ
blkio.weight Xác định tỉ lệ tương đối truy cập I/O vào 1 thiết bị của một cgroup. Giá trị của group: 100 đến 1000. Giá trị này có thể bị ghi đè bởi biên số: blkio.weight_device echo 500 > blkio.weight
blkio.weight_device Giá trị này ghi đè giá trị trên. Biến số này khác biến số trên ở điểm biến số này có thể cài đặt cho một thiết bị cố định echo 8:0 500 > blkio.weight_device

Thực nghiệm

Ta sẽ thử nghiệm tính năng này bằng cách tạo 2 container với trọng số I/O khác nhau, copy 1 file từ đĩa cứng sử dụng trọng số đấy, và quan sát tốc độ I/O của 2 container.

Để lấy thông số major/minor của thiết bị (đĩa cứng), ta có thể dùng lệnh lsblk
Ví dụ với máy mình có:

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sdb      8:16   0 278.9G  0 disk
└─sdb1   8:17   0 278.9G  0 part /lxc-images
sda      8:0    0 278.9G  0 disk
├─sda1   8:1    0   200M  0 part /boot
├─sda2   8:2    0     4G  0 part [SWAP]
└─sda3   8:3    0 274.7G  0 part /
sdc      8:32   0 278.9G  0 disk
└─sdc1   8:33   0 278.9G  0 part /data 

/dev/sda3 có major là 8, minor là 3.

Các bước thực nghiệm

Bước 1: Tạo 2 container (tham khảo phần 1)
Bước 2: Cài trọng số I/O cho từng container
$ cat /var/lib/lxc/test/config
...
lxc.cgroup.blkio.weight = 500

$ cat /var/lib/lxc/test_io/config
...
lxc.cgroup.blkio.weight = 1000

container tên là test sẽ có trọng số nhỏ hơn container có tên là test_io

Bước 3: Chạy thực nghiệm

Tạo 2 file có kích thước 2GB và copy thông qua cgroup được tạo. Bước drop_cachecần thiết giữa các lần chạy thực nghiệm vì lần thực nghiệm sau, nội dung file có thể đang nằm trong memory cache và do đó ảnh hưởng đến tốc độ đọc sẽ không còn chính xác nữa.

$ dd if=/dev/zero of=file1 bs=1000 count=2000000
$ dd if=/dev/zero of=file2 bs=1000 count=2000000
$ sync
$ echo 3 > /proc/sys/vm/drop_caches
$ cgexec -g blkio:lxc/test_io time dd if=file1 of=/dev/null &
$ cgexec -g blkio:lxc/test time dd if=file2 of=/dev/null & 
Bước 4: Dùng iostat quan sát kết quả

Với các bước thực hiện như trên, mình thu được kết quả như sau:

alt text

Do trọng số copy file1 > file 2 (1000: 500) nên tốc độ copy file1 nhanh hơn hẳn file2 (125 M/s so với 56.84 M/s). Trọng số I/O của cgroup rõ ràng ảnh hưởng đến tốc độ đọc file của đĩa cứng.

I/O Throttling

Biến số

Biến số ý nghĩa
blkio.throttle.read_bps_device Giới hạn tốc độ đọc thiết bị theo byte
blkio.throttle.read_iops_device Giới hạn tốc độ đọc thiết bị theo iops
blkio.throttle.write_bps_device Giới hạn tốc độ ghi thiết bị theo byte
blkio.throttle.write_iops_device Giới hạn tốc độ ghi thiết bị theo iops
blkio.throttle.io_serviced Thông báo số lượng thao tác I/O vào 1 thiết bị
blkio.throttle.io_service_bytes Thông báo số lượng dữ liệu I/O vào 1 thiết bị

Thực nghiệm

Để kiếm chứng tính năng này, ta cũng tiến hành thực nghiệm gần giống như ở trên. Ở ví dụ trên ta đã kiểm chứng được là tốc độ đọc đĩa cứng có thể ở mức 150M/s. Ta sẽ giới hạn tốc độ đọc đĩa cứng là 100M/s và quan sát tốc độ copy.

Bước 1: Chuẩn bị dữ liệu và cấu hình I/O
$ dd if=/dev/zero of=file3 bs=1k count=8000000
$ cat /var/lib/lxc/test/config
.....
lxc.cgroup.blkio.throttle.read_bps_device = 8:0 104857600

Số lượng I/O và thiết bị 8:0 (/dev/sda) là 100M/s (104857600 = 100 * 1024 * 1024)

Bước 2: Chạy thực nghiệm
$ sync
$ echo 3 > /proc/sys/vm/drop_caches
$ cgexec -g blkio:lxc/test time dd if=file3 of=/dev/null &
Bước 3: Dùng iotop quan sát tốc độ I/O

alt text

Ta có thể quan sát được là tốc độ copy file không vượt quá 100M/s, đúng như giá trị ngưỡng đã cài đặt.

Các biến blkio chung

Biến số ý nghĩa Ví dụ
blkio.reset_stats Ghi dữ liệu vào file này sẽ để khởi tạo lại toàn bộ dữ liệu thống kê I/O của 1 cgroup
blkio.time Thông báo thời gian 1 cgroup có truy cập I/O vào 1 device nào đó.
blkio.sectors Thông báo số lượng sectors được ghi hoặc đọc từ một cgroup nào đáy.
blkio.avg_queue_size Thông báo độ dài trung bình của queue chứa thao tác I/O
blkio.group_wait_time Thông báo tổng thời gian (nanosecond) một group phải đợi cho 1 thao tác I/O trong queue.
blkio.empty_time Thông báo tổng thời gian (nanosecond) một group không có một I/O nào phải chờ đợi.
blkio.idle_time Thông báo tổng thời gian (nanosecond) một scheduler chờ cho một request
blkio.dequeue Thông báo thời gian (nanosecond) cho một thao tác I/O
blkio.io_serviced Thông báo số lượng thao tác I/O trên 1 device khi sử dụng CFS scheduler
blkio.io_service_bytes Thông báo số lượng dữ liệu IO trên 1 thiết bị khi sử dụng CFS scheduler
blkio.io_wait_time Thông báo thời gian một thao tác IO nằm trong queue của scheduler
blkio.io_merged Thông báo số lượng IO được merge
blkio.io_queued Thông báo số lượng I/O được queue

Tham khảo

  1. https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Resource_Management_Guide/index.html
  2. https://blog.docker.com/2013/10/gathering-lxc-docker-containers-metrics/
  3. http://docs.oracle.com/cd/E37670_01/E37355/html/ol_control_containers.html
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Bùi Hồng Hà

59 bài viết.
262 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
74 8
Bài viết tổng hợp cơ chế hoạt động của https Chút ít về chữ ký điện tử Chữ ký điện tử là cơ chế bao gồm 3 thuật toán: Thuật toán chọn một khóa...
Bùi Hồng Hà viết gần 3 năm trước
74 8
White
43 7
Giới thiệu Gần đây thấy bản thân chém gió rất nhiều về MapReduce, Hadoop v.v nhưng chưa thấy có bài viết nào tổng hợp + giải thích cụ thể về MapRe...
Bùi Hồng Hà viết 2 năm trước
43 7
White
33 0
Giới thiệu Google là một công ty dẫn đầu về phần mềm xử lý Big Data. Hầu hết các phần mềm xử lý dữ liệu như Hadoop đều có nguồn gốc ý tưởng từ Goo...
Bùi Hồng Hà viết 2 năm trước
33 0
Bài viết liên quan
White
3 3
Giới thiệu Trong (Link), mình đã giới thiệu về các biến giới hạn tài nguyên I/O của subsystem blkio cũng như làm 2 thực nghiệm đối với subsystem n...
Bùi Hồng Hà viết hơn 2 năm trước
3 3
White
18 8
Giới thiệu (Ảnh) LXC (Linux Container) là môi trường ảo ở tầng hệ điều hành cho phép nhiều hệ thống Linux chạy trên cùng một máy vật lý Linux. L...
Bùi Hồng Hà viết hơn 2 năm trước
18 8
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
59 bài viết.
262 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!