在suse10上使用c程序做連接數據庫db2v9.1操作,使用top發現有三個root用戶起的進程db2syscr佔用大量cpu,導致性能急劇下降,完成一次打開數據庫操作操作200毫秒。而在redhat上,沒有該進程,並且同樣程序同樣的併發,完成一次只需要10來毫秒。
從網上查到的db2syscr進程的作用
db2syscr:
During instance startup, db2syscr process is started as root. It completes a number of tasks that require root privilege, then db2syscr switches to instance owner id and spawns db2sysc process
使用strace -f -p db2syscrpid 跟蹤相關進程和子進程,
4926 semop(2719781, 0xbff975b0, 1) = 0
4926 msgrcv(262149, 262149, {1, "\1\0\0\0q\32\0\0\350\17\1 \0\0\0\0iccs\0\0\0\0\0iccs12"...}, 8187, 0, MSG_NOERROR) = 92
4926 open("/etc/shadow", O_RDONLY) = 3
4926 fcntl64(3, F_GETFD) = 0
4926 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0
4926 _llseek(3, 0, [0], SEEK_CUR) = 0
4926 fstat64(3, {st_mode=S_IFREG|0777, st_size=742, ...}) = 0
4926 mmap2(NULL, 742, PROT_READ, MAP_SHARED, 3, 0) = 0xb7f93000
4926 _llseek(3, 742, [742], SEEK_SET) = 0
4926 munmap(0xb7f93000, 742) = 0
4926 close(3) = 0
4926 time(NULL) = 1335342434
發現db2syscr進程主要是執行一些驗證用戶名和密碼的操作,由於測試程序每次插表都要進行connect to 和disconnect,所以,db2syscr進程起作用。
之後,進一步使用下面腳本跟蹤
for i in 0 1 2 3 4 5 6 7 8 9
do
gstack db2syscrpid > db2syscrstack.out
sleep 3
done
發現,其主要做了如下些內容:
#0 0xb360933b in _crypt_blowfish_rn () from /lib/libcrypt.so.1
#1 0xb360afe4 in crypt_rn () from /lib/libcrypt.so.1
#2 0xb360b03e in fcrypt () from /lib/libcrypt.so.1
#3 0xb6bcd2f9 in sqlo_validate_pwd ()
#4 0xb6bceb4c in sqlockpw_daemon_main ()
#5 0xb6bcf14c in sqlockpw_daemon_init ()
#6 0xb55e3fb6 in sqloSystemControllerMain ()
#7 0xb55e2cd4 in sqloRunInstance () from /opt/ibm/db2/V9.1/lib32/libdb2e.so.1
#8 0x0804d47e in DB2main ()
#9 0x0804cd6c in main ()
從上面可以判斷出,suse操作系統缺省使用blowfish加密方式,而這類加密方式相對比較慢,耗時。
修改/etc/default/passwd文件,將其中的加密方式改爲md5,並且,將寫blowfish文件的屏蔽掉,之後,重新修改執行併發測試用戶的密碼,重新執行,發現db2syscr進程在執行過程幾乎可以或略,同時,訪問速度大大提升。