InterBase 5.6 效能調教的經驗分享

由於 Interbase 5.6 不支援多核的CPU,所以在windows 2003下由於 HyperThreading 功能,
反而造成InterBase 5.6 執行程序在兩個CPU之間漂移,並導致效能低落...



最近因為專案的需求,我需要與文X的會計系統做資料上的介接,由於它的資料庫是interbase,
而我們自己系統的資料庫是MS SQL,要達成的目標是可以串連兩個系統,所以我有了兩個問題需解決:

第一是需要MS SQL的資料能與InterBase的資料相互引用,最好是能直接跨資料庫join,
最後我使用了IBProvider 的元件。
(這個元件可以直接讓MSSQL Linkerserver Interbase,達成讓兩個異質資料庫可以做資料表的 Join,
這可以減少蠻多程式開發上的困擾,另外也支援ADO.Net,可在vs2005、2008使用,蠻推薦的!一套約1萬多台幣。)

第二是透過VB.Net的專案,直接寫入與讀取InterBase資料。

 

初期在我的測試環境,程式運行的還不錯,速度很快,環境是windos 2003 + interbase 7.1,
但是移到正式資料庫時(Windows 2003 + Interbase 5.6),卻發生了問題,
每次查詢或是新增都需要約13秒左右... ( 該Table資料約18萬筆 )

 

利用了一些連接interbase的工具來連接,也是類似的狀態,所以初步排除了IBProvider的問題,
這個問題對即將要上線的系統,造成很大的困擾,試想一筆資料的操作,要使用者等待10幾秒,
那真的是跟廢了沒兩樣...


接連好幾天反覆測試著不同連線參數排列組合、不同的Provider連接方式...都是相同的結果,
這讓不熟 InterBase的我,吃盡了苦頭...
 

Google了幾天,都沒有什麼頭緒,文章少的可憐,最後靈機一動,改用英文關鍵字來Google資料,
終於在國外的文章找到解決方法,原來由於 Interbase 5.6 不支援多核的CPU,
所以在windows 2003下由於 HyperThreading 功能,反而造成InterBase 5.6 執行程序在兩個CPU之間漂移,
並導致效能低落。
(註1:可惜不是使用Interbase 7.1,不然有支援ENABLE_HYPERTHREADING參數,
聽說效能可以提升10%~70%... 參考這裡)
(註2:老師說英文很重要,果然沒錯...)

 

嗯,問題找到了,那就開始著手解決 : )

首先先設定 InterBase 只使用一個CPU,在 InterBase的安裝目錄下,找到 ibconfig 文件,
並增加 #CPU_AFFINITY =1 的指令,設定完後,重開機,不過經我測試,效能並沒有多大的改善。

接著,換關閉 Windows 2003的 Hyper Threading 功能, 在 c:\boot.ini 加上 /numproc=1 後重新開機,
嘿~ 果然奏效,速度有明顯的改善,搜尋資料由原本的13秒降低至7 秒左右,且後面開始的每次搜尋都不到1秒。

接著再用 IBExpert 工具連接 Interbase,並重新計算所有的 Index,初始連接的秒速再由7秒下降到5秒,

終於到了還可以接受的速度,雖然還是不滿意...但是至少可以讓系統上線使用了...

由於真的不熟悉 InterBase,吃了很多苦頭,將過程記錄下來,留做參考,
若有熟悉 InterBase 的朋友,也請交流一下心得,告訴我是不是有機會可以將5秒再縮短,謝謝。