- 进程脏页比率多少才合适?
- 内存压力太大时,多个后台进程同时writeback,会产生大量的随机IO,设备吞吐量下降
- 如何更准确的估算设备的真实带宽?
分类: 文件系统
深入 prjquota,源码剖析
ext4 prjquota 实现原理,参考了 xfs prjquota,并且复用了linux 内核的磁盘配额管理机制的大部分实现,所以源码上分析起来还是非常简单的
linux内核本身就已经支持user、group级别的磁盘配额管理,用法可以参考:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/storage_administration_guide/ch-disk-quotas
从文件系统实现层面来看,文件系统本身并不了解什么是uid,gid,因此disk quota的实现一定是在raw file system 之上的。正因为是如此,所以 prjquota 得以复用原有 disk quota 的大量实现,之需要在原有基础之上,扩展一个新的 quota 类型而已
具体内核提交的 patch:https://lore.kernel.org/patchwork/patch/541891/
4.14 内核时,已经进入主干,因此可以参考:https://lxr.missinglinkelectronics.com/linux+v4.14/fs/ext4/
简述一下其基本设计:
- 在 super block 中,有一块专门用来存储 project id 用量的元数据区
- 每个文件,属于哪个 project id,是记录在文件的 xattr 属性里面的(正是因为 ext4 文件系统支持 xattr 扩展,所以才很方便的移植这个特性)
- 文件写入的时候,先查找这个文件的 project id,然后判断当前 project 的 usage + 文件的增量的大小,是否超过 project 的 hardlimit,如果超过,返回 EDOUT,文件写入失败
初识 prjquota,原理、实践
prjquota 的前身其实是 subtreequota,最早由 openvz 提出,2010年之后好像就没有消息了,没有进入内核主干,有点遗憾。后来我们移植过一次,但是由于设计过于复杂,功能不稳定,并且缺少社区的技术支持,最终选择了放弃。
prjquota 是 xfs 文件系统的一个原生特性,其设计简单,功能健壮。并且有人尝试把他移植到了 ext4 文件系统上。4系内核已经进入主干
prjquota 功能和 subtreequota 一样,能够限制一组具有相同 prjid 属性的文件的总大小。这些具有相同属性的 prjid,可能散落在不同的目录下,但属于同一个项目的文件拥有一个想同的project id标示,正如同一个用户的文件,或者同一个用户组的文件有相同的UserID,或者GroupID
具体实现,可以参考内核 patch:https://lwn.net/Articles/671627/
1)使能 prjquota 特性
磁盘project quota初始化,如下任意一种方法都可以:
- 重新格式化一个磁盘来支持project quota: /root/ext4/e2fsprogs/misc/mke2fs /dev/hdb -O quota,project
- 或者在已有的磁盘上使能project quota:/root/ext4/e2fsprogs/misc/tune2fs /dev/hdb -O quota,project
mount设备支持project quota:
- mount -t ext4 -o prjquota /dev/hdb xxxx/ 或者:
- mount -t ext4 /dev/hdb xxxx/; /root/ext4/quota-tools/quotaon xxxx/,但是这个方法,需要在磁盘上没有任何文件被打开的时候才能执行
创建 project id和quota限制管理
- 设置一个目录属于一个project id:/root//ext4/e2fsprogs/misc/chattr -p 1001 xxxx/test1
- 使得这个目录下的文件默认继承这个project id:/root//ext4/e2fsprogs/misc/chattr +P xxxx/test1
- 设置project的配额:/root/ext4/quota-tools/setquota -P 1001 100 100 400 500 xxxx,可以重复设置,例如更新quota,立即生效