问题排查方法
客户端日志
对于宿主机挂载,Linux、macOS 客户端日志默认为 /var/log/juicefs.log,Windows 则是 C:\Users\<username>\AppData\Local\juicefs.log。当使用 JuiceFS 出现问题时,首先查看客户端日志。而如果日志中没有明显异常,可以为挂载命令添加 --verbose 参数(支持平滑重新挂载),输出更为丰富的 DEBUG 日志。
不同 JuiceFS 客户端获取日志的方式不同,以下分别介绍。
宿主机挂载点
在挂载命令中用 --log=<log_path> 指定日志储存路径,默认为 /var/log/juicefs.log 或 ~/.juicefs/log/juicefs.log,具体取决于执行用户。
可以用 grep 命令过滤不同等级日志做性能分析或者故障诊断:
grep 'ERROR\|FATAL' /var/log/juicefs.log
Kubernetes CSI 驱动
根据你使用的 JuiceFS CSI 驱动版本会有不同的获取日志的方式,参考 CSI 驱动文档。
S3 网关
S3 网关仅支持在前台运行,因此客户端日志会直接输出到终端。如果你是在 Kubernetes 中部署 S3 网关,需要查看对应 pod 的日志。
Hadoop Java SDK
使用 JuiceFS Hadoop Java SDK 的应用进程(如 Spark executor)的日志中会包含 JuiceFS 客户端日志,因为和应用自身产生的日志混杂在一起,需要通过 juicefs 关键词来过滤筛选。
文件系统访问日志
和 juicefs.log 不一样,访问日志负责记录对文件系统的访问(比如打开文件、读取文件、关闭文件),遇到性能问题时,收集并分析访问日志会非常有帮助。
在挂载点上运行下方命令,就能实时打印文件系统的访问日志:
# 假设挂载点为 /jfs
cat /jfs/.accesslog
# 收集访问日志
cat /jfs/.accesslog > access.log
如果不方便登入客户端环境,也可以直接在控制台收集并下载访问日志:

对于 Kubernetes CSI 驱动场景,需要进入 Mount Pod 内运行相同的命令:
# 首先找到应用容器对应的 mount pod,默认名称中会含有 PVC 名,根据实际情况调整:
kubectl -n kube-system get pod | grep juicefs | grep [pvc-name]
# 也可以罗列出所有 mount pod,然后自行查找判断:
kubectl -n kube-system get pod -l app.kubernetes.io/name=juicefs-mount
# 钻进容器,打印访问日志:
kubectl -n kube-system exec juicefs-[node]-pvc-d4b8fb4f-2c0b-48e8-a2dc-530799435373 -- cat /jfs/pvc-d4b8fb4f-2c0b-48e8-a2dc-530799435373/.oplog
- JuiceFS 中的虚拟文件大小都为 0,不必感到奇怪,直接运行
cat .accesslog命令就能打印相关内容; .accesslog又名.oplog,这两个虚拟文件的作用相同;- 如果错过了操作时机,没能捕捉到关键的访问日志,还可以迅速
cat .ophistory来尝试提取,这个虚拟文件里滚动保存了少量历史日志,不超过 15M; - 对于 Hadoop SDK,需要在客户端配置中使用
juicefs.access-log配置项,指定访问日志输出的路径,默认不输出访问日志。
文件系统访问日志中记录了操作类型、UID/GID、文件 inode 及其花费的时间。访问日志可以有多种用途,如性能分析、审计、故障诊断。下方将会介绍的 juicefs profile 命令正是根据访问日志统计各种文件系统操作,在命令行汇总呈现统计信息。你可以使用该命令快速统计并判断出你的应用对于文件系统的访问模式,评估访问性能。
持久化访问日志
上方介绍的采集方式只能用于获取实时日志并现场保存,如果需要长期保留历史日志,用于审计或者问题排查,可以通过以下方式:
- 为挂载点添加
--access-log参数,指定日志保存路径; - 私有部署 在文件系统设置页面,开启审计日志功能,可以为所有客户端开启收集访问日志。日志文件存储在元数据节点的数据目录并且定时滚动。
日志格式
我们选取了一些常见的文件系统操作,将访问日志的样例与格式说明在下方进行示范,日志中用 inode 来表示文件,如果需要从 inode 反查文件详细信息,可以使用 juicefs info [INODE]。
# 大体上格式如下,不同类型日志稍有区别:
# [UID,GID,PID] [调用方法] [ 输入参数(不同方法参数有别)]: [OK] [排查信息] <耗时(秒)>
# open,输入参数 (inode, flags)
[uid:0,gid:0,pid:1631098] open (38597810,0x8000): OK (38597810,[-rw-r--r--:0100644,1,0,0,1650446639,1650446639,1650446639,212]) (direct_io:0,keep_cache:1) [handle:00007869] <0.010293>
# read,输入参数 (inode, size, offset, file-handler)
[uid:0,gid:0,pid:0] read (148199375,69632,1439510528,18333): OK (69632) <0.001047>
# getattr,输入参数 (inode)
[uid:0,gid:0,pid:1631098] getattr (1): OK (1,[drwxrwxrwx:0040777,19977521,0,0,1634886025,1663052916,1663052916,9265059409920]) <0.000002>
# statfs,输入参数 (inode)
[uid:0,gid:0,pid:1240206] statfs (1): OK (47474945257472,62476217520128,1165873,4293801422) <0.000345>
# setattr,输入参数 (inode, setmask, mode)
[uid:0,gid:0,pid:1631098] setattr (45758905,0x1,[mode=-rw-r--r--:00644;]): OK (45758905,[-rw-r--r--:0100644,1,0,0,1664165438,1664165438,1664165438,4096]) <0.011076>
# create,输入参数 (parent-inode, name, mode, umask)
[uid:0,gid:0,pid:1631098] create (1,.temp.sh.swp,-rw-------:0100600,00000,0x280C2): OK (45758905,[-rw-------:0100600,1,0,0,1664165438,1664165438,1664165438,0]) [handle:00007868] <0.011117>
# write,输入参数 (inode, size, offset, file-handler)
[uid:0,gid:0,pid:1631098] write (45758905,4096,0,18333): OK <0.000040>
# unlink,输入参数 (parent-inode, name)
[uid:0,gid:0,pid:1631098] unlink (1,temp.sh~): OK <0.011033>
# flush,输入参数 (inode, file-handler)
[uid:0,gid:0,pid:1631098] flush (45758905,18333): OK <0.030459>
实时统计数据
JuiceFS 在每个挂载点的根目录下提供了一个文件名为 .stats 的纯文本格式虚拟文件,记录了实时的统计数据。在进行故障诊断和分析的时候,查看这个文件里面的统计数据将会非常有帮助。这些统计数据也可以通过 JSON API 或者 Prometheus API 收集,参考「监控」文档。
不同 JuiceFS 客户端获取实时统计数据的方式不同,以下分别介绍。