R
我正在进行一项数据分析,需要使用编程语言(特别是包)将大约 112GB 的大型数据矩阵加载到内存映射文件中bigmemory
(请参阅https://cran.r-project.org/web/packages/bigmemory/index.html)。该矩阵有80664列,356751行。
数据存储由 NFS 安装的 XFS 文件系统组成。
XFS 挂载选项包括:
xfs noatime,nodiratime,logbufs=8,logbsize=256k,largeio,inode64,swalloc,allocsize=131072k
NFS 正在使用以下选项导出 FS:
rw,async,no_subtree_check,no_root_squash
NFS 客户端使用以下选项挂载 FS:
defaults,async,_netdev
加载文件一段时间后,计算节点变得无响应(包括集群上的其他节点),并且文件服务器日志报告以下错误:
XFS: possible memory allocation deadlock in kmem_alloc (mode:0x250)
我可以通过删除缓存来解决这个问题:
echo 3 > /proc/sys/vm/drop_caches
文件服务器有16 GB内存。
我已经阅读过以下博客:
https://blog.codecentric.de/en/2017/04/xfs-possible-memory-allocation-deadlock-kmem_alloc/
但是,该问题不是由于碎片造成的,因为报告的碎片化程度低于我正在写入的文件系统的 2%。
因此,由于上述 XFS 错误,我假设文件服务器内存不足,因为它无法处理当前任务发出的 IO 请求数量。
除了定期删除缓存(例如通过cron
)之外,还有其他更持久的解决方案吗?
先谢谢您的帮助。
编辑:客户端和服务器上的 CentOS 7.2。
编辑#2:客户端和服务器上的内核 3.10.0-229.14.1.el7.x86_64。
答案1
它与内存碎片和文件系统碎片有关,请参阅 https://bugzilla.kernel.org/show_bug.cgi?id=73831
您应该使用 检查文件系统碎片xfs_db -r -c 'frag' <filesystem>'
。保持文件系统不太满(80% 或更少)并运行xfs_fsr
一段时间也应该有帮助。
答案2
我相信 CentOS 7 的当前版本有内核 3.10.0-693.2.2.el7 和较新的 XFS 用户空间工具。任何原因你使用的不是最新版本的操作系统?你指定的版本可追溯到 2015 年。