feat: enable limiting and reserving gpu resources

This commit is contained in:
Jose Diaz-Gonzalez
2020-04-14 16:14:37 -04:00
parent aa94dc7a7b
commit 8a380e52c4
7 changed files with 28 additions and 4 deletions

View File

@@ -26,6 +26,7 @@ Valid resource options include:
- `--network`
- `--network-ingress`
- `--network-egress`
- `--nvidia-gpu`
See the [Supported Resource Management Properties](/docs/advanced-usage/schedulers/docker-local.md#supported-resource-management-properties) section of the docker local scheduler documentation for more information on how each resource limit maps to Docker.
@@ -86,6 +87,7 @@ dokku resource:limit node-js-app
network: 100
network-ingress:
network-egress:
nvidia-gpu:
```
This may also be combined with the `--process-type` flag to see app limits on a process-type level. Note that the displayed values are not merged with the defaults.
@@ -103,6 +105,7 @@ dokku resource:limit --process-type web node-js-app
network:
network-ingress:
network-egress:
nvidia-gpu:
```
#### Clearing Resource Limits
@@ -182,6 +185,7 @@ dokku resource:reserve node-js-app
network:
network-ingress:
network-egress:
nvidia-gpu:
```
This may also be combined with the `--process-type` flag to see app reservations on a process-type level. Note that the displayed values are not merged with the defaults.
@@ -198,6 +202,7 @@ dokku resource:reserve --process-type web node-js-app
network:
network-ingress:
network-egress:
nvidia-gpu:
```
#### Clearing Resource Reservations
@@ -238,12 +243,14 @@ dokku resource:report
web limit network: 10
web limit network ingress:
web limit network egress:
web limit nvidia gpu:
web reservation cpu:
web reservation memory: 512
web reservation memory swap:
web reservation network: 8
web reservation network ingress:
web reservation network egress:
web reservation nvidia gpu:
=====> python-sample resource information
web limit cpu:
web limit memory:
@@ -251,12 +258,14 @@ dokku resource:report
web limit network:
web limit network ingress:
web limit network egress:
web limit nvidia gpu:
web reservation cpu:
web reservation memory:
web reservation memory swap:
web reservation network:
web reservation network ingress:
web reservation network egress:
web reservation nvidia gpu:
=====> ruby-sample resource information
web limit cpu:
web limit memory:
@@ -264,12 +273,14 @@ dokku resource:report
web limit network:
web limit network ingress:
web limit network egress:
web limit nvidia gpu:
web reservation cpu:
web reservation memory:
web reservation memory swap:
web reservation network:
web reservation network ingress:
web reservation network egress:
web reservation nvidia gpu:
```
You can run the command for a specific app also.
@@ -286,12 +297,14 @@ dokku resource:report node-js-app
web limit network: 10
web limit network ingress:
web limit network egress:
web limit nvidia gpu:
web reservation cpu:
web reservation memory: 512
web reservation memory swap:
web reservation network: 8
web reservation network ingress:
web reservation network egress:
web reservation nvidia gpu:
```
You can pass flags which will output only the value of the specific information you want. For example:

View File

@@ -71,6 +71,8 @@ The `docker-local` scheduler supports a minimal list of resource _limits_ and _r
- See the ["Memory" section](https://docs.docker.com/config/containers/resource_constraints/#memory) of the Docker Runtime Options documentation for more information.
- memory-swap: (docker option: `--memory-swap`) and should be specified with a suffix of `b` (bytes), `k` (kilobytes), `m` (megabytes), `g` (gigabytes)
- See the ["Memory" section](https://docs.docker.com/config/containers/resource_constraints/#memory) of the Docker Runtime Options documentation for more information.
- nvidia-gpus: (docker option: `--gpus`), is specified in number of Nvidia GPUs a process can access.
- See the ["GPU" section](https://docs.docker.com/config/containers/resource_constraints/#gpu) of the Docker Runtime Options documentation for more information.
### Resource Reservations

View File

@@ -15,6 +15,7 @@ type Resource struct {
Network string `json:"network"`
NetworkIngress string `json:"network-ingress"`
NetworkEgress string `json:"network-egress"`
NvidiaGPU string `json:"nvidia-gpu"`
}
// ReportSingleApp is an internal function that displays the app report for one or more apps

View File

@@ -26,6 +26,7 @@ func main() {
network := args.String("network", "", "network: The amount of network bandwidth to limit processes by")
networkIngress := args.String("network-ingress", "", "network-ingress: The amount of ingress network bandwidth to limit processes by")
networkEgress := args.String("network-egress", "", "network-egress: The amount of egress network bandwidth to limit processes by")
nvidiaGpu := args.String("nvidia-gpu", "", "nvidia-gpu: The number of Nvidia GPUs to limit a process to")
args.Parse(os.Args[2:])
resources := resource.Resource{
@@ -35,6 +36,7 @@ func main() {
Network: *network,
NetworkIngress: *networkIngress,
NetworkEgress: *networkEgress,
NvidiaGPU: *nvidiaGpu,
}
err = resource.CommandLimit(args.Args(), *processType, resources)
@@ -57,6 +59,7 @@ func main() {
network := args.String("network", "", "network: The amount of network bandwidth to reserve for processes")
networkIngress := args.String("network-ingress", "", "network-ingress: The amount of ingress network bandwidth to reserve for processes")
networkEgress := args.String("network-egress", "", "network-egress: The amount of egress network bandwidth to reserve for processes")
nvidiaGpu := args.String("nvidia-gpu", "", "nvidia-gpu: The number of Nvidia GPUs to resource for a process")
args.Parse(os.Args[2:])
resources := resource.Resource{
@@ -66,6 +69,7 @@ func main() {
Network: *network,
NetworkIngress: *networkIngress,
NetworkEgress: *networkEgress,
NvidiaGPU: *nvidiaGpu,
}
err = resource.CommandReserve(args.Args(), *processType, resources)

View File

@@ -100,6 +100,7 @@ func clearByResourceType(appName string, processType string, resourceType string
"network",
"network-ingress",
"network-egress",
"nvidia-gpu",
}
for _, key := range resources {
@@ -121,6 +122,7 @@ func setResourceType(appName string, processType string, r Resource, resourceTyp
"network": r.Network,
"network-ingress": r.NetworkIngress,
"network-egress": r.NetworkEgress,
"nvidia-gpu": r.NvidiaGPU,
}
hasValues := false
@@ -182,6 +184,7 @@ func reportResourceType(appName string, processType string, resourceType string)
"network",
"network-ingress",
"network-egress",
"nvidia-gpu",
}
for _, key := range resources {

View File

@@ -32,6 +32,7 @@ func TriggerDockerArgsProcessDeploy(appName string, processType string) error {
validLimits := map[string]bool{
"cpu": true,
"nvidia-gpu": true,
"memory": true,
"memory-swap": true,
}
@@ -54,6 +55,10 @@ func TriggerDockerArgsProcessDeploy(appName string, processType string) error {
parts[1] = "cpus"
}
if parts[1] == "nvidia-gpu" {
parts[1] = "gpus"
}
limits[parts[1]] = value
}
if parts[0] == "reserve" {

View File

@@ -141,10 +141,6 @@ teardown() {
echo "output: $output"
echo "status: $status"
assert_output "536870912"
# run /bin/bash -c "docker inspect --format '{{.HostConfig.NanoCpus}}' $CID"
# echo "output: $output"
# echo "status: $status"
# assert_output "500000000"
run /bin/bash -c "dokku resource:reserve-clear --process-type worker $TEST_APP"
echo "output: $output"