我注意到我的 PHP 会话文件夹中有数百万个包含相同会话数据的文件。例如,假设它是一个 48 字节长的字符串,内容保持不变。
我们假设 /var/tmp/php/sessions 中有大约 150 万个这样的会话文件
如果我算得没错的话,48 字节 * 1500000 个文件 / 1024 / 1024 = 约 68 MB。
但如果我执行以下操作,我会得到 6G 的结果
cd
/var/tmp/php/sessions
du -ch
1)为什么显示6G(大约)?(下面我的第二个问题中可能包含答案)
更多检查:按文件大小降序排列文件,以检查最大文件大小。单个文件大小为 4k
du -a | sort -n -r | head -n 10
6464600 .
4 ./sess_fffffABCDcdf9c312340f094d165678
我替换了上面文件名中的某些字符。
2)为什么显示4k? 这与文件系统块大小有关。6G 的使用现在有点意义了。参考:https://stackoverflow.com/questions/26666642/why-the-size-of-an-empty-directory-in-linux-is-4kb
3)如果我使用 Redis 作为 PHP 的会话句柄,它肯定会比磁盘更快,但理论上它只会使用 RAM 上大约 68 MB 的数据,也许还会加上一些开销?
4)如果 Redis 中存储的值相同,即对于不同的会话键,相同的值重复 150 万次,Redis 是否会尝试减少实际内存使用量?
我无法控制会话及其数据,也无法阻止会话的创建或删除其内容,即使它是重复的。
我希望得到对我的前两个问题的确认,并且如果可能的话,对问题 3 和 4 提供更多的解释和参考。
答案1
- 它显示六千兆字节,因为文件系统上的最小分配块大小为四千字节。
- 是的,它与FS块大小有关。
- Redis 的速度会比磁盘快,但速度不会快太多,因为数据很可能位于操作系统文件系统缓存中。它使用的内存比磁盘上的会话存储要少。但是,确切的规模很难知道,需要阅读代码才能估计,或者设置测试系统并测量内存使用情况。
- 在 Google 上搜索“redis 重复数据删除”会显示一些页面,这些页面表明 Redis 可以执行您描述的任务以减少内存占用。我不知道这些功能的实际实现状态。