「vsftpd」- 当使用NFS挂载时,上传/下载特别慢

  CREATED BY JENKINSBOT

内容简介

解决问题:当使用NFS挂载点作为FTP目录时,上传/下载特别慢。

问题描述

在系统中,运行vsftpd服务,并使用NFS挂载点作为vsftpd文件上传目录。

出现的问题是上传/下载超时。并且,在上传时,文件可以创建成功,但是大小为零。

系统环境

操作系统: CentOS release 6.9 (Final)
vsftpd: version 2.2.2 (vsftpd -v)
NFS: vers=3 (nfsstat -m)

问题原因

# 问题诊断

在执行动作(比如上传)时:

	(1)首先VSFTPD请求NFS客户端,要求上传之前锁定文件。
	(2)然后NFS客户端发出lock调用。
	(3)但是服务端NFS v3并不支持文件锁定,而产生失败。
	(4)客户端进行重试,最后超时。

可以观察NFS的日志(/var/log/messages)发现这一点。

# 附加说明

由于NFS v2、NFS v3协议不支持文件锁定,所与文件锁有关的调用可能都会失败。但是NFS v2、NFS v3支持NLM(Network Lock Manager)协议,它为通过NFS共享的文件提供「Unix记录锁定」,使客户端能够与其他客户端同步它们的I/O请求,以确保数据的完整性。(这里有一些技术细节我并没有弄清楚,可能正常启动rpc.lockd与rpc.statd就可以正常使用文件锁了,所以我遇到的问题可能是服务没有正常运行。)

但是NFS v4支持文件锁,但是不支持NLM协议。通过NFS v4进行挂载(mount -t nfs -overs4),使用PHP的flock()进行测试,能够正常获取锁。

解决办法

最好的做法当然是使用NFS v4协议挂载。总要有个“但是”:情况复杂,很多服务器都是NFS v3挂载,双协议混合使用又未经过测试,弄不好NFS服务还要升级。

为了解决问题,在挂载时使用nolockmount -onolock)选项进行重新挂载。

相关链接

Linux NFS Overview, FAQ and HOWTO Documents
flock(2) versus fcntl(2) over a NFS
On the Brokenness of File Locking

参考文献

!!! FTP put/get is slow on mapr nfs mount point
!!! 11.2. NFS and file locking docstore.mik.ua/orelly/networking_2ndEd/nfs/ch11_02.htm
!!! IBM/Network lock manager
How to Check NFS Version from Linux Command Line
How to determine if NFS mount is mounted as v3 or v4?
How to enable logging (most verbose) for vsftpd?
How do I remount a filesystem as read/write?
IBM/Locking in NFS version 4
Managing Network File Systems in Oracle® Solaris 11.2