a7i opened a new issue, #3867:
URL: https://github.com/apache/celeborn/issues/3867

   Hello Celeborn Community!
   
   As the title suggests, we are having disk performance issues. I will take 
the first few sections to reveal our setup. I'm hoping to see what other are 
doing to remediate some of these bottlebecks.
   
   ### Deployment
   
   Running Celeborn **0.7.0** with Spark.
   
   - Workers pinned per AZ (`celeborn.tags` + client `tagsExpr`)
   - Push replication off (single copy in the AZ)
   - One worker pod per shuffle node
   - Shuffle data on **instance store** (not EBS)
   - Single `celeborn.worker.storage.dirs` entry (`/mnt/disk1`)
   
   ### Disk layout (shuffle nodes)
   
   Separate boot volume; data NVMe disks go into one LVM striped volume group. 
Celeborn only sees the kubelet mount.
   
   *i8ge.6xlarge: 2× data NVMe. i8ge.12xlarge: 4× data NVMe (same layout, wider 
stripe).*
   
   ```mermaid
   flowchart TB
     boot["Boot NVMe — root FS only"]
   
     subgraph data["Data NVMe ×2 or ×4"]
       d1["nvme0n1"]
       d2["nvme1n1"]
       dMore["…"]
     end
   
     lvm["LVM VG nvme — striped 256K"]
     lvPods["LV nvme-kubelet"]
     lvCtr["LV nvme-containerd"]
     dm["dm-0"]
     ext4["ext4 noatime"]
     kubelet["/var/lib/kubelet/pods"]
     empty["Pod emptyDir"]
     worker["Celeborn /mnt/disk1"]
   
     boot ~~~ data
     d1 & d2 & dMore --> lvm
     lvm --> lvPods
     lvm --> lvCtr
     lvPods --> dm --> ext4 --> kubelet --> empty --> worker
   ```
   
   ```
     boot NVMe                          data NVMe (×2 or ×4)
          |                                    |
      / (root)                    LVM VG "nvme" (stripe 256K)
                                             |
                           +-----------------+------------------+
                           |                                    |
                 nvme-kubelet                       nvme-containerd
                           |
                        dm-0
                           |
                        ext4
                           |
               /var/lib/kubelet/pods  (per-pod UID dirs)
                           |
                    emptyDir (sizeLimit)
                           |
                 Celeborn /mnt/disk1
   ```
   
   Under prod bursts, **`dm-0` IO util** pegs (~100%) and that’s the limiter. 
NIC and master CPU aren’t the story. Trying to figure out if we’re missing a 
Celeborn knob or if it’s more workers / less shuffle data.
   
   ### What we’ve already tried (worker / node)
   
   On **i8ge.6xlarge** (2× ~7.5TB NVMe, 24 vCPU, 192 GiB):
   
   - Congestion watermarks tuned so we don’t exclude the whole AZ during 
absorbable Netty bursts (disk still healthy, lots of free space)
   - SSD flusher threads **16 → 32 → 64** (64 helped flush-queue depth and job 
wall time in sustained tests; 128 was worse)
   - Flusher buffer **512K → 2M** (helped queue depth under the same load)
   - Node readahead turned up: no measurable gain on fetch-like reads (8m 
chunks, qd1)
   - fio on the **same path Celeborn uses** (scratch under a live pod UID under 
`/var/lib/kubelet/pods`, `direct=1`, 512K blocks)
   
   | Pattern | fio ceiling | Celeborn under load |
   | --- | --- | --- |
   | Sequential write | 3.08 GB/s (~92% of ceiling) | 2.83 GB/s |
   | Sequential read | 6.23 GB/s (~70% of ceiling) | 4.34 GB/s |
   | Mixed 70/30 read / write | 6.24 / 2.68 GB/s (~81% of ceiling) | 4.34 / 
2.83 GB/s |
   
   Both data NVMe devices at ~100% in fio and in the load test (via `dm-0` 
slaves). More aggressive fio only buys a few percent on writes. Readahead and 
AMI queue tuning didn’t move the needle.
   
   Rolling **i8ge.12xlarge** (4× NVMe in one striped LV, same Celeborn layout) 
and **more workers per AZ**. Dashboard still screams disk; 12xlarge helps a bit 
on peak write MB/s but not a 2× step. Still finishing fio on 12xlarge.
   
   ### Prod-ish worker settings
   
   - `celeborn.worker.flusher.ssd.threads=64`
   - `celeborn.worker.flusher.buffer.size=2M`
   - Congestion control enabled (watermarks derived from direct-memory cap)
   - Large `MaxDirectMemorySize` (120g on 6xlarge, 240g on 12xlarge)
   - `celeborn.client.*` does **not** come from our server ConfigMap; Spark 
uses defaults unless the app repo sets something
   
   ### What I’m asking
   
   Not a bug report (workers healthy, flush latency fine, tons of disk free). 
When you’re already within ~10% of fio on writes on current-gen AWS NVMe, what 
do you recommend?
   
   1. Fair to treat **per-worker disk bandwidth** as a hard cap and optimize 
around it (more workers, less shuffle bytes) instead of more flusher/congestion 
tuning?
   2. **Client / Spark**: compression, partition count, in-flight limits 
(`maxReqsInFlight`, etc.)? Anything that works when the worker is 
drain-limited, not Netty-limited?
   3. **Read-heavy** phases: guidance on **direct memory vs page cache** on 
big-memory boxes? Sustained test had reads as a large share of disk traffic; 
fio read ceiling was higher than Celeborn hit.
   4. **Congestion / exclusion**: all workers in an AZ excluded for “high 
workload” while disks still look fine. Pattern to avoid registration failures 
when the limiter is transient memory pressure, not disk health?
   5. **Sizing**: bigger box with more NVMe vs more workers per AZ. Any rule of 
thumb on cloud instance store?
   
   Happy to add 12xlarge fio when it’s done. If the answer is mostly “put this 
in the tuning guide,” I’ll do a doc PR once I know what you’d want said.
   
   Thank you!


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to