When you schedule a large number of SAS jobs at the same time (for example, through Jobs and Flows or the SAS Scheduler) in a SAS Viya deployment running on Kubernetes or OpenShift, not all of the jobs run. Above a certain level of concurrency, some jobs never start. These jobs are not displayed on the Jobs and Flows monitoring tab, and no SAS error occurs for the missing jobs.
Note: Reducing the number of jobs launched at the same time avoids the problem.
This issue occurs when SASWORK (the temporary work location of the SAS Compute and Batch servers) is backed by a dynamically provisioned storage class, LVMS (which uses TopoLVM), rather than by the default emptyDir volume. In that configuration, Kubernetes creates one PersistentVolumeClaim (PVC) for each job.
The behavior comes from how these per-job volumes are created. When SASWORK uses a storage class, the storage provisioner must create and bind a dedicated volume for every job pod, and that creation is serialized: LVM serializes metadata operations on a volume group, and the LVMS or TopoLVM node component creates one volume at a time per node, giving a ceiling of approximately one volume per second per node. When many jobs start at once, the volumes cannot be created quickly enough. Pods whose volume is not bound in time are never scheduled, and the corresponding jobs are dropped without any SAS error.
This issue is a provisioning throughput limit, not a disk, capacity, or compute problem. During such a run, disk activity is low, the volume group is healthy with free space, and there is no CPU or memory pressure.
The following approach distinguishes this storage provisioning limit from a compute, capacity, or SAS application problem.
There are three ways to address this issue, and you can combine the three methods.
(Recommended for High Currency) Use the Default emptyDir Volume for SASWORK
emptyDir is node-local and does not create a PVC for each job, which removes the bottleneck at its source. emptyDir is set through the SAS deployment overlay for the SAS Programming Run-Time Environment (sas-bases/examples/sas-programming-environment/storage) without changing the LVM operator.
Confirm first that the compute nodes contain enough local storage for the peak SASWORK usage. Note that emptyDir supports only a soft sizeLimit, which evicts the pod when exceeded, and not a hard maximum WORK size per session.
Stagger the Job Submissions
Submit the jobs in smaller waves instead of all at once so that the submission rate matches the provisioning rate. The workable wave size and interval depend on the environment and sizing—in particular, the number of nodes that run compute pods. Because provisioning runs at about one volume per second per node, larger clusters sustain larger waves.
Start conservatively and increase the batch size until you find the level that your environment handles without losing jobs. Staggering reaches a high total number of jobs without changing the storage configuration, but it is an operational practice rather than a configuration change.
Add Worker Nodes
Because provisioning is serialized at about one volume per second per node, the aggregate rate scales with the number of nodes that run compute pods. Adding nodes shortens the time needed to bring up a large batch. There is no supported user-facing setting to raise the per-node provisioning concurrency and is not changed by a version upgrade. The OpenShift or storage team handles this rate.
By default, SASWORK is backed by an emptyDir volume that uses storage on the node. A storage class is configured only when larger or dedicated work volumes are required. That choice reintroduces per-job dynamic provisioning and the behavior described above. For more information, see the SAS documentation topic "Configure Storage for the SAS Programming Run-Time Environment."