由於密碼加密方式不同而導致db2連接慢得問題

 在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進程在執行過程幾乎可以或略,同時,訪問速度大大提升。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章