我的Debiannetworking服务器上使用Apache2与mod_php PHP会话似乎是随机失败,说没有空间来写他们:
sudo tail -60 /var/log/apache2/error.log [Fri Jan 30 15:55:35 2015] [error] [client xxx.xxx.xxx.xxx] PHP Warning: session_start() [<a href='function.session-start'>function.session-start</a>]: open(/tmp/sess_555555555555555555, O_RDWR) failed: No space left on device (28) in /path/to-first-session-use/core/bootstrap.php on line 18
当我尝试:
ls /tmp
它只是永远挂起,所以这是不好的。
但是,当我检查可用空间,并检查inode的使用是否合理…
$ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 150G 121G 22G 85% / tmpfs 2.0G 0 2.0G 0% /lib/init/rw udev 10M 16K 10M 1% /dev tmpfs 2.0G 4.0K 2.0G 1% /dev/shm $ df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/sda1 19922944 11143605 8779339 56% / tmpfs 513524 4 513520 1% /lib/init/rw udev 513524 135 513389 1% /dev tmpfs 513524 3 513521 1% /dev/shm
数字看起来不错。 当然,85%比我想要的要多,但不是99%。
我怀疑这是一个问题,因为5年没有重新启动机器,也许创build了很多小文件,但是我得到的inode信息与此相矛盾。 我应该在哪里调查呢?
编辑:
ls -l /
drwxrwxrwt 4 root root 692M Feb 1 11:09 tmp/ drwxr-xr-x 10 root root 4.0K Jan 1 2013 usr/ drwxr-xr-x 14 root root 4.0K Oct 7 2010 var/ ...etc
这可能是因为/tmp/目录本身充满了没有得到清理的陈旧的PHP会话; 这意味着问题的根源可能会被隔离到/tmp/目录本身。 如果是这样的话,我会删除所有/tmp/sess_*文件。 首先列出所有的sess_*文件,如下所示:
ls -la /tmp/sess_*
或者你可以像这样用wc来计数:
ls -la /tmp/sess_* | wc -l
现在,一旦你得到一些确认,那里有一些疯狂的文件,继续运行这个命令删除/tmp/sess_*文件:
sudo rm -rf /tmp/sess_*
而短暂的会话文件将被吹走。
但另一个蛮横的力量,但相对安全的方式来处理这个事情是吹掉/tmp目录本身,重新创build/tmp目录并重新启动服务器。
由于/tmp目录基本上是caching材料的编码手柄,所以没有任何有效的内容。 所以我最好的build议是运行以下命令来删除&重build/tmp目录。
rm -rf /tmp && mkdir /tmp/ && chown root:root /tmp && chmod 1777 /tmp
现在,一个class轮基本上是由&&连接的shell命令列表,它们将首先删除/tmp ,重新创build/tmp ,将/tmp的所有权更改回root:root ,然后为/tmp目录设置适当的权限。 如果你愿意的话,如果你觉得这样做更安全的话,你可以一个接一个地执行每个命令。
sudo rm -rf /tmp sudo mkdir /tmp sudo chown root:root /tmp sudo chmod 1777 /tmp
一旦完成,我会build议重新启动服务器。 事情应该冷静清理。
有时损坏的文件系统可以做到这样的效果 – 例如,当目录/ tmp损坏。 或者 – 当有很多文件。
对于“快速”修复:
mv /tmp /tmp.xxx mkdir /tmp chmod a+rwxt /tmp
如果有帮助 – 尝试重新启动系统和fsck根文件系统。 如果没关系 – 只要删除/tmp.xxx目录。
另一种可能性是 – 当/ tmp是“其他”分区或tmpfs(在linux vservers上看到) – 但不是由df显示(因为df从/ etc / mtab文件中获取有时不正确的分区列表)。 尝试通过命令直接在tmp上检查磁盘空间:
df /tmp df -i /tmp
其他选项通常有助于会话 – 它使用其他会话机制。 如果你有很多的临时会话,这不需要非常持久 – 我会build议使用memcache进行会话存储。 configuration很简单 – 你必须安装php-memcache,然后在php.conf中configurationmemcached:
session.save_handler = memcache session.save_path="tcp://server:port?persistent=1&weight=1&timeout=1&retry_interval=15"
然后 – 会话将存储在内存caching中,直到定义的大小。 超过它 – 最古老的将被自动删除。
对我来说,改变fs.inotify.max_user_watches是有用的。
root@grostruc:/# service ssh restart Error: No space left on device root@grostruc:/# sysctl fs.inotify.max_user_watches fs.inotify.max_user_watches = 65536 root@grostruc:/# sysctl fs.inotify.max_user_watches=262144 fs.inotify.max_user_watches = 262144 root@grostruc:/# service ssh restart
修复/etc/sysctl.conf中更改的值