内核参数SEMMSL SEMMNS SEMOPM SEMMNI参数的设置
这四个参数自己一直没搞清楚
今天问了下同事,大概整了一下,后面会再补充。
以下是linux文档上的说明:
/proc/sys/kernel/sem (since Linux 2.4)
This file contains 4 numbers defining limits for System V IPC semaphores. These fields are, in order:
SEMMSL The maximum semaphores per semaphore set.
SEMMNS A system-wide limit on the number of semaphores in all semaphore sets.
SEMOPM The maximum number of operations that may be specified in a semop(2) call.
SEMMNI A system-wide limit on the maximum number of semaphore identifiers.
semaphore set:信号量集。
semaphore :信号量。
自己根据这个说明,画了一个图。
SEMMSL,SEMOPM:设置process+10
SEMMNI:设置为100。这个参数决定了操作系统启动时初始化信号集的个数。
SEMMNS:SEMMSL*SEMMNI
SEMOPM主要的限制体现在:
1.lgwr写完之后通知应用进程的过程中,也就是主要影响log file sync(如设置250,一次semops最多可以通知250个应用进程,当应用commit厉害时,semops会大大增加,会到影响系统性能)。
2.发生大规模enqueue lock时,通知等待在此锁资源上的进程(如果有500个进程等待同一个锁,则需要进行2次semops调用,来通知等待的进程,锁可以使用了)。
补充:SEMOPM是一个系统调用,类似的还有semtimedop调用。
可以跟踪一下oracle的lgwr进程,可以看到秒隔3秒调用一次semtimedop,是一个超时调用,当semtimedop()调用致使lgwr进程进入睡眠,因为logbuffer在空闲的情况下有一个3秒刷一次的机制:
[oracle@fd_perf4 ~]$ ps -ef|grep lgwr
oracle 15341 1934 0 19:49 pts/0 00:00:00 grep lgwr
oracle 15445 1 0 2010 ? 00:14:06 ora_lgwr_fd_perf4
[oracle@fd_perf4 ~]$ strace -p 15445
Process 15445 attached – interrupt to quit
times(NULL) = 2742619382
semtimedop(98304, 0x7fbfffde70, 1, {1, 420000000}) = -1 EAGAIN (Resource temporarily unavailable)
times(NULL) = 2742619524
times(NULL) = 2742619524
times(NULL) = 2742619524
semtimedop(98304, 0x7fbfffde70, 1, {3, 0}) = -1 EAGAIN (Resource temporarily unavailable)
times(NULL) = 2742619824
times(NULL) = 2742619824
getrusage(RUSAGE_SELF, {ru_utime={237, 721860}, ru_stime={608, 380512}, …}) = 0
getrusage(RUSAGE_SELF, {ru_utime={237, 721860}, ru_stime={608, 380512}, …}) = 0
times(NULL) = 2742619824
semtimedop(98304, 0x7fbfffde70, 1, {3, 0}) = -1 EAGAIN (Resource temporarily unavailable)
times(NULL) = 2742620124
times(NULL) = 2742620124
times(NULL) = 2742620124