feat(api): Add blkio cgroup tuning via --blkio flag#1595
Conversation
| ], | ||
| dependencies: [ | ||
| .package(url: "https://github.com/apple/containerization.git", exact: Version(stringLiteral: scVersion)), | ||
| .package(url: "https://github.com/full-chaos/containerization.git", branch: scVersion), |
There was a problem hiding this comment.
Will remove before merge.
| _serve/ | ||
| .vscode/** | ||
| .worktrees/** | ||
| .worktress/** |
There was a problem hiding this comment.
Will remove before merge.
| @@ -13,10 +13,10 @@ | |||
| { | |||
| "identity" : "containerization", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/containerization.git", | |||
| "location" : "https://github.com/full-chaos/containerization.git", | |||
| "state" : { | |||
| "revision" : "db5b5b98405d53543f69105087130ffd623a5b9a", | |||
| "version" : "0.32.2" | |||
| "branch" : "feat/chaos-1380-blkio-runtime", | |||
| "revision" : "3d009dfc2724fc924dd18ca2014b5e839d554163" | |||
| } | |||
There was a problem hiding this comment.
Will revert before merge.
Two changes addressing review feedback from apple/containerization#739 and apple#1512 (comment): 1. Adopt the new `Containerization.LinuxBlockIO` wrapper added in containerization PR apple#739 (pin advanced to 3d009df). The wire format in `ContainerConfiguration.Resources.blockIO` stays as the Codable `ContainerizationOCI.LinuxBlockIO`; `RuntimeService.configureContainer` converts to the wrapper at the boundary via the new `toContainerizationBlockIO` helper. 2. Replace the six separate `--blkio-*` / `--device-*` flags with a single repeatable `--blkio` flag using key=value[,key=value] syntax, per apple#1512 (comment): --blkio weight=500 --blkio device=/dev/sda,weight=700,leaf-weight=300 --blkio device=/dev/sda,read-bps=1048576,write-bps=1048576 --blkio device=/dev/sda,read-iops=1000,write-iops=1000 Device values accept either an absolute host path (resolved via stat(2)) or a literal `<major>:<minor>`. Parser rejects unknown keys, conflicting global weights, and global-only keys appearing on device-less specs. Tests cover the combined spec, major:minor literal, invalid-weight, unknown-key, and global-only-on-device-spec error paths.
2921cd9 to
8265a51
Compare
| /// Memory in bytes allocated. | ||
| public var memoryInBytes: UInt64 = 1024.mib() | ||
| /// Block I/O resource limits. | ||
| public var blockIO: LinuxBlockIO? |
There was a problem hiding this comment.
This definitely moves it in the desired direction. Since this is a Linux-specific option, it'd be better that this become a field in LinuxRuntimeData and then if LinuxBlockIO needs to be present, you populate it there, encode the LinuxRuntimeData as runtimeData for the RuntimeConfiguration type, and then the RuntimeService can decode the runtime config, check for the presence of runtimeData, decode out LinuxRuntimeData, and do as it pleases with the result.
We don't want to have things that are overtly OS-specific in the ContainerConfiguration.
| public var memory: String? | ||
|
|
||
| @Option( | ||
| name: .customLong("blkio"), |
There was a problem hiding this comment.
We don't really have a good mechanism for providing OS-specific options on the CLI (it's going to require some non-trivial rework on our command line processing), so I think the best thing here is just to have this be options like we do for non-generic volume options (I'm aiming to do this networks as well).
I wouldn't document the option list here as it'll turn the help output into a text wall. Better to update the command reference under docs where we can have a huge list, table, whatever.
There was a problem hiding this comment.
Since it would be options this should go under Flags.Management instead of Flags.Resource.
…imeData Addresses jglogan review feedback on PR apple#1595: 1. Move `blockIO` field out of the cross-platform `ContainerConfiguration.Resources` and into the Linux-specific `LinuxRuntimeData`. The CLI now encodes `LinuxRuntimeData(blockIO: …)` into the opaque `RuntimeConfiguration.runtimeData` field, and the Linux runtime decodes it inside `configureContainer` before applying the OCI `LinuxBlockIO` to `czConfig.blockIO`. Keeps OS-specific options out of the generic container config type. 2. Move the `--blkio` flag from `Flags.Resource` to `Flags.Management` and simplify its help to a single line pointing at the command reference, in the spirit of the existing generic options pattern. The structured key=value parsing/validation in `Parser.blockIO` is unchanged. 3. `Parser.resources` no longer takes `blkio`; `Parser.blockIO` stays public and is now invoked by `ContainerRun` / `ContainerCreate` directly. Tests rewritten to exercise `Parser.blockIO` directly. `swift build` clean; `swift test --filter ParserTest` 105 tests pass, `RuntimeConfiguration` tests pass, `container run --help` shows `--blkio` under MANAGEMENT OPTIONS. Deferred (per PR body): Package.swift / Package.resolved still pin containerization to apple/containerization#739's branch because that upstream PR is still open. Those will revert to apple/containerization at merge time, once apple#739 lands.
|
Pushed 1.
|
Type of Change
Motivation and Context
Closes #1512.
Adds block I/O cgroup tuning to
container run/container createsocompose translators (e.g. container-compose) can pass through Docker
Compose
service.blkio_configinstead of warn-skipping it.The CLI shape follows the grouped, repeatable key=value form proposed in
#1512 (comment):
The
device=value accepts either an absolute host path (resolved viastat(2)for major/minor) or a literal<major>:<minor>. Keys allowedon a per-device spec:
weight,leaf-weight,read-bps,write-bps,read-iops,write-iops. Keys allowed on a global spec (nodevice=):weight,leaf-weight. Parser rejects unknown keys, conflictingglobal weights, and global-only keys mixed onto device-less specs.
Runtime plumbing
Block I/O propagates as
ContainerConfiguration.Resources.blockIO(serialised as
ContainerizationOCI.LinuxBlockIO) and is converted toContainerization.LinuxBlockIOat the runtime boundary inRuntimeService.configureContainer.Dependency
Depends on apple/containerization#739, which introduces
Containerization.LinuxBlockIO(theSendablewrapper around the OCItype) and wires it into
LinuxContainer.Configuration. While that PR isunmerged this branch pins
containerizationto the PR branch(
full-chaos/containerization@feat/chaos-1380-blkio-runtime,revision
3d009df). Before merge, the pin must be moved back toapple/containerizationat whatever revision lands #739.Testing
swift buildclean,swift test --filter ParserTestpasses(105 tests, 5 new):
testResourcesBlockIOFlags— combined global + per-device + throttletestResourcesBlockIOAcceptsMajorMinorLiteral—device=8:0literaltestResourcesRejectsInvalidBlockIOWeight— weight outside 10..1000testResourcesRejectsUnknownBlockIOKey— typo detectiontestResourcesRejectsGlobalKeyOnDeviceSpec—read-bpswithoutdevice=container run --helpconfirmed renders the new--blkioflag.