Home | Syndication | Delicious | Douban | Twitter

Archive for February, 2005

Configure Linux kernel parameters to run DB2

February 3rd, 2005

本文介绍了如何配置 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.