Skip to content

Commit 538a1db

Browse files
authored
Merge pull request #1066 from yunzhu-li/blkio-control
Add support for Block IO constraints in HostConfig
2 parents 787f3f5 + 896d36e commit 538a1db

File tree

3 files changed

+85
-2
lines changed

3 files changed

+85
-2
lines changed

docker/utils/utils.py

Lines changed: 58 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -615,8 +615,12 @@ def create_host_config(binds=None, port_bindings=None, lxc_conf=None,
615615
security_opt=None, ulimits=None, log_config=None,
616616
mem_limit=None, memswap_limit=None, mem_swappiness=None,
617617
cgroup_parent=None, group_add=None, cpu_quota=None,
618-
cpu_period=None, oom_kill_disable=False, shm_size=None,
619-
version=None, tmpfs=None, oom_score_adj=None):
618+
cpu_period=None, blkio_weight=None,
619+
blkio_weight_device=None, device_read_bps=None,
620+
device_write_bps=None, device_read_iops=None,
621+
device_write_iops=None, oom_kill_disable=False,
622+
shm_size=None, version=None, tmpfs=None,
623+
oom_score_adj=None):
620624

621625
host_config = {}
622626

@@ -792,6 +796,58 @@ def create_host_config(binds=None, port_bindings=None, lxc_conf=None,
792796

793797
host_config['CpuPeriod'] = cpu_period
794798

799+
if blkio_weight:
800+
if not isinstance(blkio_weight, int):
801+
raise host_config_type_error('blkio_weight', blkio_weight, 'int')
802+
if version_lt(version, '1.22'):
803+
raise host_config_version_error('blkio_weight', '1.22')
804+
host_config["BlkioWeight"] = blkio_weight
805+
806+
if blkio_weight_device:
807+
if not isinstance(blkio_weight_device, list):
808+
raise host_config_type_error(
809+
'blkio_weight_device', blkio_weight_device, 'list'
810+
)
811+
if version_lt(version, '1.22'):
812+
raise host_config_version_error('blkio_weight_device', '1.22')
813+
host_config["BlkioWeightDevice"] = blkio_weight_device
814+
815+
if device_read_bps:
816+
if not isinstance(device_read_bps, list):
817+
raise host_config_type_error(
818+
'device_read_bps', device_read_bps, 'list'
819+
)
820+
if version_lt(version, '1.22'):
821+
raise host_config_version_error('device_read_bps', '1.22')
822+
host_config["BlkioDeviceReadBps"] = device_read_bps
823+
824+
if device_write_bps:
825+
if not isinstance(device_write_bps, list):
826+
raise host_config_type_error(
827+
'device_write_bps', device_write_bps, 'list'
828+
)
829+
if version_lt(version, '1.22'):
830+
raise host_config_version_error('device_write_bps', '1.22')
831+
host_config["BlkioDeviceWriteBps"] = device_write_bps
832+
833+
if device_read_iops:
834+
if not isinstance(device_read_iops, list):
835+
raise host_config_type_error(
836+
'device_read_iops', device_read_iops, 'list'
837+
)
838+
if version_lt(version, '1.22'):
839+
raise host_config_version_error('device_read_iops', '1.22')
840+
host_config["BlkioDeviceReadIOps"] = device_read_iops
841+
842+
if device_write_iops:
843+
if not isinstance(device_write_iops, list):
844+
raise host_config_type_error(
845+
'device_write_iops', device_write_iops, 'list'
846+
)
847+
if version_lt(version, '1.22'):
848+
raise host_config_version_error('device_write_iops', '1.22')
849+
host_config["BlkioDeviceWriteIOps"] = device_write_iops
850+
795851
if tmpfs:
796852
if version_lt(version, '1.22'):
797853
raise host_config_version_error('tmpfs', '1.22')

docs/hostconfig.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ for example:
109109
* cpu_group (int): The length of a CPU period in microseconds.
110110
* cpu_period (int): Microseconds of CPU time that the container can get in a
111111
CPU period.
112+
* blkio_weight: Block IO weight (relative weight), accepts a weight value between 10 and 1000.
113+
* blkio_weight_device: Block IO weight (relative device weight) in the form of:
114+
`[{"Path": "device_path", "Weight": weight}]`
115+
* device_read_bps: Limit read rate (bytes per second) from a device in the form of:
116+
`[{"Path": "device_path", "Rate": rate}]`
117+
* device_write_bps: Limit write rate (bytes per second) from a device.
118+
* device_read_iops: Limit read rate (IO per second) from a device.
119+
* device_write_iops: Limit write rate (IO per second) from a device.
112120
* group_add (list): List of additional group names and/or IDs that the
113121
container process will run as.
114122
* devices (list): Host device bindings. See [host devices](host-devices.md)

tests/unit/utils_test.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,25 @@ def test_create_host_config_with_cpu_period(self):
6464
config = create_host_config(version='1.20', cpu_period=1999)
6565
self.assertEqual(config.get('CpuPeriod'), 1999)
6666

67+
def test_create_host_config_with_blkio_constraints(self):
68+
blkio_rate = [{"Path": "/dev/sda", "Rate": 1000}]
69+
config = create_host_config(version='1.22',
70+
blkio_weight=1999,
71+
blkio_weight_device=blkio_rate,
72+
device_read_bps=blkio_rate,
73+
device_write_bps=blkio_rate,
74+
device_read_iops=blkio_rate,
75+
device_write_iops=blkio_rate)
76+
77+
self.assertEqual(config.get('BlkioWeight'), 1999)
78+
self.assertTrue(config.get('BlkioWeightDevice') is blkio_rate)
79+
self.assertTrue(config.get('BlkioDeviceReadBps') is blkio_rate)
80+
self.assertTrue(config.get('BlkioDeviceWriteBps') is blkio_rate)
81+
self.assertTrue(config.get('BlkioDeviceReadIOps') is blkio_rate)
82+
self.assertTrue(config.get('BlkioDeviceWriteIOps') is blkio_rate)
83+
self.assertEqual(blkio_rate[0]['Path'], "/dev/sda")
84+
self.assertEqual(blkio_rate[0]['Rate'], 1000)
85+
6786
def test_create_host_config_with_shm_size(self):
6887
config = create_host_config(version='1.22', shm_size=67108864)
6988
self.assertEqual(config.get('ShmSize'), 67108864)

0 commit comments

Comments
 (0)