`
yale
  • 浏览: 357466 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

No space left on device

阅读更多

我在oracle、jboss、apache的linux环境下中遇到过"No space left on device"的错误,开始的时候以为是磁盘空间不够,但是发现很多时候,并不是这样,是因为系统的信号量不够用了

# ipcs -s
______________________________ Semaphore Arrays ______________________________
key        semid      owner      perms      nsems
0x00000000 19234816   oraclerac1    600        1
0x00000000 19267585   oraclerac1    600        1
0x00000000 19300354   oraclerac1    600        1
0x00000000 19398659   oraclerac1    600        1
0x00000000 19431428   oraclerac1    600        1
0x00000000 19464197   oraclerac1    600        1
0x00000000 19562502   oraclerac1    600        1


用这行命令删除所有的信号量即可:ipcs -s | grep nobody | perl -lane 'print `ipcrm sem $F[1]`'

当然也可以修改信号量的配置,etc/sysctl.conf,修改kernel.sem参数即可,那么我想说的是为什么要修改信号量,信号量是什么,如何设置?

 

为什么?

因为Semaphore是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

 

 

是什么?

Semaphore分为单值和多值两种,前者只能被一个线程获得,后者可以被若干个线程获得。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。在这个停车场系统中,车位是公共资源,每辆车好比一个线程,看门人起的就是信号量的作用,因此信号量的特性如下:信号量是一个非负整数(车位数),所有通过它的线程(车辆)都会将该整数减一(通过它当然是为了使用资源),当该整数值为零时,所有试图通过它的线程都将处于等待状态。在信号量上我们定义两种操作: Wait(等待) 和 Release(释放)。 当一个线程调用Wait(等待)操作时,它要么通过然后将信号量减一,要么一直等下去,直到信号量大于一或超时。Release(释放)实际上是在信号量上执行加操作,对应于车辆离开停车场,加操作实际上是释放了由信号量守护的资源

 

如何设置?

查看kernel.sem查看当前设置:#cat /proc/sys/kernel/sem,4个参数分别对应:SEMMSL、SEMMNS、SEMOPM、SEMMNI这四个核心参数,

SEMMSL :用于控制每个信号集的最大信号数量,建议将 SEMMSL 设置为参数文件中的最大 PROCESSES或Thread实例参数的设置值再加上 10。

SEMMNS:用于控制整个 Linux 系统中信号(而不是信号集)的最大数,建议将 SEMMNS 设置为:系统中每个PROCESSES或Thread实例参数设置值的总和,加上最大 PROCESSES或Thread值的两倍,最后根据系统中 中间件或数据库的数量,每个加 10 。

 SEMOPM: 内核参数用于控制每个 semop 系统调用可以执行的信号操作的数量。一个信号集能够拥有每个信号集中最大数量的SEMMSL 信号,因此建议设置 SEMOPM 等于SEMMSL ,建议将SEMOPM 的值设置为不少于PROCESSES或Thread最小值 。

SEMMNI :内核参数用于控制整个 Linux 系统中信号集的最大数量。建议将 SEMMNI 的值设置为不少于PROCESSES或Thread的最小值。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics