0

我目前在更精确地性能方面遇到了一个巨大的问题:通过大量 I/O 在包含大量文件(+100.000)的平面会话文件夹上生成负载。

sessionfiles/htdocs 文件夹位于托管存储上 - 两个单独的服务器(在负载平衡器后面)通过​​ nsf-mount 使用这些文件(apache2),并同时访问相同的会话文件夹(以保持其持久性)。

不幸的是,该项目非常频繁,并且正在生成大量会话文件。即使 ans max_lifetime 为 2 小时,我们也生成了 +100.000 个会话文件,这对于 IO 节点来说已经非常重要了。

是否有可能将这些会话动态拆分为子文件夹?例如,所有带有 sess_1* 的会话文件都放入 /tmp/sessions/1,sess_2 放入 /tmp/sessions/2 等等?使用这种方法,存储/IO 节点只需处理每个文件夹约 10.000 个,这将加快垃圾收集并防止 IO 负载。

我从 PHP (session.save_path) 文档中找到了这段摘录:

http://de3.php.net/manual/en/session.configuration.php#ini.session.save-path

此指令有一个可选的 N 参数,用于确定您的会话文件将分布在的目录级别数。例如,设置为 '5;/tmp' 可能最终会创建一个会话文件和位置,如 /tmp/4 /b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If 。为了使用 N,您必须在使用前创建所有这些目录。在 ext/session 中存在一个小的 shell 脚本来执行此操作,它称为 mod_files.sh,Windows 版本称为 mod_files.bat。另请注意,如果使用了 N 且大于 0,则不会执行自动垃圾收集,请参阅 php.ini 的副本以获取更多信息。此外,如果您使用 N,请务必将 session.save_path 括在“引号”中,因为分隔符 (;) 也用于 php.ini 中的注释。

有没有人以前在 php 中实现过这个,并且可以为我提供一些示例 php 代码来使用这个 mod_files.sh 处理子文件夹中的会话文件?

不幸的是,它的记录很差......

4

1 回答 1

2

有时解决方案比最初看起来要容易。不知何故,我认为 PHP 必须处理和管理对会话目录树的 apache 请求。然而,一旦 session:save_path 被改变,Apache 就会自行完成。

1.)通过 ssh调用这个(修改过的)脚本(http://snipplr.com/view/27710/modfilessh-php/ )一次:

*sh path/to/script/mod_files.sh path/to/sessions depth*(在我的例子中:“mod_files.sh /tmp/sessions 1”

2.)仔细检查新会话目录树的 chown 权限

3.)将“session.save_path”更改为“1;/tmp/sessions”

不过还是感谢您的帮助!

于 2012-08-14T07:50:17.737 回答