本文介绍了如何配置 Linux 的内核参数以运行 DB2。基本环境是:
Memory: 2G
OS: Red Hat Enterprise Linux AS release 3 (Taroon Update 3)
DB2: IBM DB2 v8.2
1. 存在的问题
与运行 DB2 相关的内核配置项通常包括三个方面:共享内存段(shmmax)、信号数组(sem)和消息队列(msgmni)。 DB2 比较消耗资源, Linux 的缺省配置在运行数据量比较大的 DB2 应用时就显得偏小。
以下是试图在内核缺省配置下,在数据库中建立一个 pagesize 为 16K 的 bufferpool :
$ db2 create bufferpool bigpool4 immediate size 1000 pagesize 16K
我们将会收到如下反馈:
SQL20189W The buffer pool operation (CREATE/ALTER) will not take effect until the next database startup due to insufficient memory. SQLSTATE=01657
返回的消息是说内存不足,但是此时通过指令 free 查看:
$ free
total used free shared buffers cached
Mem: 2046884 191144 1855740 0 7840 108980
-/+ buffers/cache: 74340 1972544
Swap: 2096472 0 2096742
很明显,真正的原因并非物理内存不足。
2. 查看当前内核配置
2.1. 通过指令 ipcs -l 来参看当前 shmmax, sem, msgmni 的限制
# ipcs -l
—— Shared Memory Limits ——–
max number of segments = 4096
max seg size (kbytes) = 262144
max total shared memory (pages) = 8388608
min seg size (bytes) = 1
—— Semaphore Limits ——–
max number of arrays = 1024
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
—— Messages: Limits ——–
max queues system wide = 1024
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
2.2. 查看目录 /proc/sys/kernel 下的相应文件
# cat /proc/sys/kernel/sem
250 32000 32 1024
# cat /proc/sys/kernel/shmmax
268435456
3. 修改内核参数
在 Red Hat Linux 中,可以使用 /etc/sysctl.conf 来控制内核配置。在该文件的尾部追加以下两行:
kernel.shmmax = 1073741824
kernel.sem = 250 256000 32 1024
说明:
- shmmax
通常对于 DB2, Oracle 一类的应用,需要把最大共享内存区设置为物理内存的 50% 大小,在本文中,即为 1G。 - sem
RHEL3 的默认值为 "250 32000 32 1024" ,我适当增大了第二项的值。
4. 启用新配置
当然,重启机器是一种保险的启用新内核配置的方法,不过 RHEL 自身提供了一种直接激活手段:
# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmmax = 1073741924
kernel.sem = 250 256000 32 1024
在激活新配置时,文件 /etc/sysctl.conf 的内容被打印在终端上。
检查一下,看看是否生效:
# ipcs -l
—— Shared Memory Limits ——–
max number of segments = 4096
max seg size (kbytes) = 1048576
max total shared memory (pages) = 8388608
min seg size (bytes) = 1
—— Semaphore Limits ——–
max number of arrays = 1024
max semaphores per array = 250
max semaphores system wide = 256000
max ops per semop call = 32
semaphore max value = 32767
—— Messages: Limits ——–
max queues system wide = 1024
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384
# cat /proc/sys/kernel/sem
250 256000 32 1024
# cat /proc/sys/kernel/shmmax
1073741824
注:红色的字就是发生了改变的值。
5. Appendix
[root@devws root]# uname -a
Linux devws 2.4.21-20.ELsmp #1 SMP Wed Aug 18 20:46:40 EDT 2004 i686 i686 i386 GNU/Linux
[root@devws root]# cat /etc/redhat-release
Red Hat Enterprise Linux AS release 3 (Taroon Update 3)
[db2inst1@devws db2inst1]$ db2level
DB21085I Instance "db2inst1" uses "32" bits and DB2 code release "SQL08020" with level identifier "03010106".
Informational tokens are "DB2 v8.1.0.64", "s040812", "MI00086", and FixPak "7".
Product is installed at "/opt/IBM/db2/V8.1".
END.