错误现象:

启动apache时无报错信息,但是不能访问网页。LAMP结构的在线交易平台,apache的错误日志信息出现一天内容为:

No space left on device:mod_rewrite:could not create rewrite_log_lock Configuration Failed

给人第一印象就是由于磁盘空间耗尽导致,由于linux磁盘空间分为三个部分物理磁盘inode节点和信号量磁盘空间等。因此可从这三个方面下手

首先是物理磁盘空间

[root@study ~]# ls /dev/shm/
[root@study ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2       9.7G  4.1G  5.1G  45% /
tmpfs           672M     0  672M   0% /dev/shm
/dev/sda1       194M   28M  156M  16% /boot
/dev/sr0        3.6G  3.6G     0 100% /mnt
/dev/sdb5        20G  3.4G   16G  19% /data

inode节点磁盘空间

[root@study ~]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2       640848 122279  518569   20% /
tmpfs           171855      1  171854    1% /dev/shm
/dev/sda1        51200     38   51162    1% /boot
/dev/sr0             0      0       0     - /mnt
/dev/sdb5      1310720  47164 1263556    4% /data

第三种则是信号量磁盘空间:

信号量是一种锁机制,用于协调进程间互斥的访问临界资源,以确保某种共享资源不被多个进程同事访问。linux系统的信号用于进程间通信。其包含两种标准实现,分别为POSIX及System V,大多数linux系统都实现了这两种标准。这两种标准都可用于进行线程间的通信只是系统电泳的方式不同。

其中System v信号量通过系统调用semget来创建,可通过linux命令ipcs即可显示进程间通信用的System v类型信号量及共享内存

POSIX信号量可用于线程和进程间通信,并可分为有名和无名两种。

    其中有名的信号量存储在/dev/shm下,因此可用于不相关进程间通信,而无名信号量只能用于先进城间和父子进程间通信。

查看linux系统默认信号量的设置值

[root@study ~]# cat /proc/sys/kernel/sem 
2503200032128

4个输出值得含义如下:

SEMMSL,控制每个信号集的最大信号数

SEMMNS,此参数用于控制整个linux系统中信号的最大数量

SEMOPM,用于控制每个semop系统调用可以执行的信号操作数

SEMMNI,此内核参数用于控制整个linux系统中信号集的最大数量

解决信号量耗尽:

ipcs -s | grep daemon

daemon是启动apache的进程用户,默认是daemon,也可能是nobody用户,根据实际情况而定。

通过ipcrm命令清楚运行命令如下

[root@study ~]# ipcs -s | grep daemon | perl -e 'while (<stdin>) { @a=split(/\s+/); print `ipcrmsem @a[1]`}'


执行完毕后,再次启动apache,然后查看httpd进程是否启动。



摘自《构建高可用linux服务器建构实战》 高俊峰著