本文提供一组面向 AlluxioRuntime + S3 兼容后端高并发读场景的调优配置。
这组配置来自 issue #5802 的排查:fio 通过 S3 后端的 AlluxioRuntime 读取数据时,在高并发下可能挂住。它不修改 Alluxio 内部实现,用户可以通过 spec.properties 和 FUSE args 显式配置。
问题在接近以下环境中复现:
- Kubernetes v1.26.7
- Fluid v1.0.8 和排查时的 Fluid master
- Alluxio 2.9.5
- SeaweedFS 3.80 作为 S3 兼容后端
- 1 个 Alluxio master,1 个 worker,以及 FUSE
- S3 中 64 个文件,每个约 5GiB
fio 命令如下:
FILES=$(seq -f "/data/file%g" 0 63 | paste -sd:)
fio -iodepth=1 -rw=read -ioengine=libaio -bs=256k \
-numjobs=<numjobs> -group_reporting -size=5G \
--filename="$FILES" -name=read_test --readonly -direct=1 --runtime=60未应用这组调优配置时观察到的现象:
numjobs=8和numjobs=16能完成。- 更高并发,例如
numjobs=32或numjobs=64,可能挂住。 - 挂住后测试 Pod 可能无法正常删除。
- 强制删除后,节点上的 fio 或 FUSE 状态仍可能残留卡住。
验证结果表明,这组调优主要缓解 Alluxio 2.9.5 在 S3 高并发读下的 FUSE/client 读路径压力。在复现环境中,JNI-FUSE 可能出现路径锁超时;使用 JNR/libfuse2 时,还需要同时调大 S3 线程和 worker client pool,并关闭 direct memory IO,才能让重复 numjobs=64 稳定通过。
仅建议在 S3 或 S3 兼容后端的高并发读场景中使用这组配置。其他工作负载建议保持默认行为,除非你已经在自己的环境中验证了同样的调优。
apiVersion: data.fluid.io/v1alpha1
kind: AlluxioRuntime
metadata:
name: my-s3
spec:
replicas: 1
master:
resources:
requests:
cpu: 8
memory: 32Gi
limits:
cpu: 8
memory: 32Gi
worker:
resources:
requests:
cpu: 8
memory: 32Gi
limits:
cpu: 8
memory: 64Gi
fuse:
jvmOptions:
- "-Xmx16G"
- "-Xms16G"
- "-XX:+UseG1GC"
- "-XX:MaxDirectMemorySize=32g"
- "-XX:+UnlockExperimentalVMOptions"
- "-XX:ActiveProcessorCount=16"
resources:
requests:
cpu: 16
memory: 32Gi
limits:
cpu: 16
memory: 64Gi
args:
- fuse
- --fuse-opts=kernel_cache,rw,allow_other,entry_timeout=60,attr_timeout=60,max_background=256,congestion_threshold=256
properties:
alluxio.fuse.jnifuse.enabled: "false"
alluxio.fuse.jnifuse.libfuse.version: "2"
alluxio.underfs.s3.threads.max: "2048"
alluxio.user.block.worker.client.pool.max: "8192"
alluxio.user.block.size.bytes.default: "64MB"
alluxio.user.streaming.reader.chunk.size.bytes: "64MB"
alluxio.user.local.reader.chunk.size.bytes: "64MB"
alluxio.worker.network.reader.buffer.size: "64MB"
alluxio.user.direct.memory.io.enabled: "false"
tieredstore:
levels:
- mediumtype: SSD
path: /path/to/ssd/mount
quota: 100G
high: "0.95"
low: "0.6"注意事项:
- 设置
alluxio.fuse.jnifuse.enabled=false和alluxio.fuse.jnifuse.libfuse.version=2,使用 JNR/libfuse2。 - 使用 libfuse2 时,需要从 FUSE args 中移除
max_idle_threads=*。max_idle_threads是 libfuse3 参数。 - 调大 S3 threads 和 worker client pool,以承载高并发读。
- 增大 read chunk 和 buffer,减少请求碎片化。
- 设置
alluxio.user.direct.memory.io.enabled=false。在验证环境中,这是让重复numjobs=64稳定通过的关键。
请使用 Kubernetes Secret 保存访问密钥,不要把 AK/SK 硬编码到 YAML 中。
apiVersion: data.fluid.io/v1alpha1
kind: Dataset
metadata:
name: my-s3
spec:
mounts:
- mountPoint: s3://<bucket-name>/<path-to-data>/
name: s3
options:
alluxio.underfs.s3.endpoint: <s3-endpoint>
alluxio.underfs.s3.endpoint.region: <s3-endpoint-region>
encryptOptions:
- name: aws.accessKeyId
valueFrom:
secretKeyRef:
name: mysecret
key: aws.accessKeyId
- name: aws.secretKey
valueFrom:
secretKeyRef:
name: mysecret
key: aws.secretKey挂载 Dataset,并在 /data 下运行 fio。请使用包含 fio 命令的镜像,或在测试容器中安装 fio 后再运行压测。
apiVersion: v1
kind: Pod
metadata:
name: fio-reader
spec:
restartPolicy: Never
containers:
- name: client
image: <image-with-fio>
securityContext:
runAsUser: 0
command: ["/bin/bash", "-lc", "sleep infinity"]
volumeMounts:
- mountPath: /data
name: data
readOnly: true
subPath: s3
volumes:
- name: data
persistentVolumeClaim:
claimName: my-s3
readOnly: true在验证环境中,通过 Fluid 生成的 AlluxioRuntime 配置应用上述调优配置后:
numjobs=8: passed
numjobs=16: passed
numjobs=32: passed
numjobs=64: passed
repeat numjobs=64: passed
test Pod deletion: passed
Alluxio master/worker/fuse restart count: 0
应用调优配置后未再观察到以下错误症状:
DeadlineExceededRuntimeExceptionTimer expiredOutOfDirectMemoryError
Alluxio 日志中仍可能出现 TempBlockMeta not found 警告,但在验证环境中,fio 可以成功完成,测试 Pod 可以正常删除,Runtime 组件也保持健康。
- 这是一个调优配置,不是 Alluxio 内部实现修复。
- 这些参数已在 issue #5802 的 S3 兼容工作负载中验证。不同 S3 后端、对象大小、网络延迟和并发级别可能仍需要调参。
- 关闭 direct memory IO 可以提升这个工作负载的稳定性,但可能影响性能。
- 如果应用这组配置后仍出现同类问题,请在强制删除 Pod 前收集 FUSE 日志、worker 日志、节点进程状态、mount 信息和 kubelet 日志。