错误现象:
启动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 -hFilesystem 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 -iFilesystem 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 () { @a=split(/\s+/); print `ipcrmsem @a[1]`}'
执行完毕后,再次启动apache,然后查看httpd进程是否启动。
摘自《构建高可用linux服务器建构实战》 高俊峰著