我当初选择具备 2.5G 网卡的工控机,就是为了搭建虚拟化系统与 NAS 之间的高速通道,便于高速访问 NAS 的共享存储。
对于 NAS 设备,我个人是不喜欢 ALL IN ONE 的,就是把所有东西都安装在 NAS 里,比如各种路由系统、各种流媒体系统、各种服务器、虚拟机等。我认为 NAS 就是 NAS,干存储就行,多余的活别揽,只要稳定、低功耗、默默无声即可。可能我的偏见是对的,也可能只是因为最近太穷,没钱升级高配置的 NAS 罢了。
事故的来龙去脉是这样的:
我一直的打算就是,工控机搭建虚拟化,虚拟化平台创建虚拟机,虚拟机里部署各种业务系统,然后业务数据通过挂载 NAS 的 NFS 共享存储来集中存储。跟所有未经现实拷打的想法一样,我对此充满美好的期待。
在这些天“静态管理”的大环境下,我抽空做了一下实施——用 kodbox (可道云)搭建私有云盘。果然,巴掌终究是要落下的——内网上传文件到云盘速度很慢。
经验丰富的我,自然一眼就看出问题所在,kodbox 采用是的分片上传,小文件存储到 NFS 共享存储里写入速度很慢。这说明 NFS 存储小文件是有性能问题的,毕竟大文件的连续写速度我之前测试均值是有 50 MB/s 的。
发现问题,当然要先验证问题,再想办法解决问题。
我把 kodbox 的源码压缩包上传到 NFS 挂载目录进行解压,一个 32M 的 zip 压缩包文件,解压耗时有大概 9 分钟。凡事都要有个对比,在虚拟机系统盘里解压,耗时 0.647 秒;在 NAS 主机的 NAS 硬盘里解压,耗时 1.911 秒。这么大差距,我真的难以通融。
我想问题它既然存在,它就是一直存在,遇到问题的就不止我一人。
在一番资料搜集汇总各指导方针之后,调优无非从三个方向进行:
- 磁盘层(NFS Server 端上磁盘读写性能)
- 应用层(针对 NFS 建立的应用程序)
- 网络层(NFS 依赖的传输网络)
具体措施:
- 通过设置 NFS 数据块大小调优
- 通过设置 MTU 值来调优
- 通过设置 timeo(等待回传数据包时间) 和 restrans(重试回传总次数)进行调优
- 开启更多 NFS 进程
- 通过 RPC 传输由同步改为异步来调优
经过了一番折腾后,我的过程成了一本书——《NFS存储业务数据从期待到放弃》。我调优的结果,不是从乌龟速度变成了树懒速度,就是从乌龟速度变成脱了沙袋的乌龟速度。
结局是让人失望的,但挂在 NAS 的共享存储来作为数据盘,也不是没有其他办法,iscsi 就是一种。不过,iscsi 的问题就是麻烦和风险,不小心弄错了会导致数据丢失。一是由于它基于块存储,它需要预先配额且配额后直接占用了原 NAS 存储的空间;二是使用它的客户端需要进行分区,格式化,再挂载;三服务端给 iscsi 存储池扩容后,客户端需要进行重新分区,再把新分区与旧分区合并。
NFS 共享存储不是不能用,用来作为文件备份盘挺不错的。至于用不用 iscsi,再说了。