周 帆
(中國兵器工業第203研究所,西安 710065)
隨著精確制導武器的信息化程度不斷提高,制導部件、控制系統以及火控、偵指系統之間相互交換的數據量也隨之激增。半實物仿真中需要對過程變量進行實時記錄并存儲,便于設計人員進行事后分析。目前,一般的做法是,整個仿真實驗系統部署一臺數據庫服務器,數據采集單元將采集到的數據以文件形式保存,在實驗完成后將所有的數據文件通過特定的格式轉換腳本或轉換軟件導入數據庫。
這種應用模式的問題是:1)應用復雜度高。目前系統中一般都采用微軟的SQL Server、MySQL等數據庫產品,但這些產品都是面向大型企業級應用,雖然其功能非常強大、成熟度很高,但配置復雜、使用難度較高以及需要專門的維護人員等約束使得部分實驗系統中的數據庫利用率極低,沒有起到應有的作用。2)操作流程復雜。各種數據采集節點將數據按一定的格式保存,在導入數據庫時,需要針對不同的格式提供專門的工具進行數據抓取后錄入,增加了操作復雜度。3)價格昂貴,性價比低。考慮到半實物仿真實驗系統中一般只能用到數據庫系統相當小的一個功能子集,其性價比是相當低的。
鑒于以上三點,文中提出了采用輕量級的嵌入式數據庫系統SQLite為基礎的半實物仿真系統設計方案。
SQLite是一款輕量級的開放源碼數據管理系統,支持絕大多數SQL92標準操作。最初是由D.Richard Hipp為美國海軍艦載反導系統設計,提供免安裝、免維護的數據存儲、管理能力,用于取代反導系統中龐大、復雜的Informix后端數據庫服務器。2000年夏天SQLite推出1.0版本,到目前為止,SQLite已經發布3.7.11 版。
1)免維護。SQLite數據庫管理系統無需安裝即可直接使用,用戶可以直接對數據庫進行操作,不需要專門的數據庫管理員首先去創建相應的數據庫實例。系統宕機或斷電不會導致數據丟失的問題。
2)無需服務器,通常使用的各種數據庫產品都有一個服務器進程,用戶需要對數據庫操作時都要用到一些進程間通信的方式來訪問數據庫。而對于SQLite來說,用戶進程可以對存儲在硬盤上的數據庫文件直接進行操作,不需要任何中間環節。
3)單一數據庫文件。SQLite數據庫和硬盤上的一個普通文件沒有任何區別,可以直接刪除,或移動到其它任何目錄或載體中。而普通的數據庫管理系統一般都把數據庫文件放在一個特定的目錄下,只有數據庫管理系統可以訪問它,雖然這增加了數據的安全性,但是隨之而來的建立和維護復雜度卻大大提高。
4)穩定的跨平臺支持能力。SQLite數據庫文件格式是跨平臺的,一旦數據庫文件創建后,不論是Windows、類Unix平臺,32位或64位平臺都可以直接使用。
5)占用資源少,處理速度快,經過優化的SQLite僅為350KiB左右。
某型精確制導武器半實物仿真系統中,采用SQLite取代原先的SQL Server 2000數據庫,系統部署圖如圖1所示。

圖1 SQLite在仿真系統中的部署圖
SQLite數據庫直接部署在數據采集節點上,采集節點的業務邏輯不用發生任何改變,只需要將對文件的操作替換為對本地SQLite數據庫的操作即可。下面給出使用SQLite實現采集節點業務邏輯的代碼片段:


至此,數據庫就已準備就緒可以通過SQL語句進行操作了。在數據記錄線程中,首先從數據總線或數據緩沖區讀取一幀數據,然后將數據組幀到一條SQL的insert語句中,再通過SQLite3_exec執行這條insert語句即可數據的入庫操作:

最后,使用SQLite3_close(db)關閉數據庫即完成了一次數據記錄與入庫的操作。
在該半實物仿真系統中,需記錄的過程變量為60~80個,這里以80個為例,即每次向數據庫中插入80個變量,進行100次插入操作考察數據錄入的時間。圖2給出了將數據寫入數據庫的時間測試結果(測試平臺:硬件:Intel Pentium Dual 2.2GHz,1GB DDR2內存,7200RPM SATA-II硬盤,軟件:Windows XP sp2 ,visual studio C++6.0 sp6,SQLite 3.7.11)。

圖2 數據庫插入操作時間
從圖2可以看出,直接使用SQLite執行一條SQL的插入語句時延范圍在78~157ms,均值為98.29ms。數據表明這樣的數據錄入效率將嚴重影響記錄節點的運行,對于項目采樣頻率為1kHz的需求而言,一次數據錄入將導致丟失100幀的數據。這種情況下,如果要使用SQLite數據庫,只能在采集任務開始前,開辟足夠的內存空間,所有的數據先記錄在內存中,待一次采集任務完成后將所有數據再插入數據庫中。這種方案有兩個問題:1)采集任務完成后的數據錄入過程耗時過長,這里還是以每幀80個變量為例,數據采集時間為20s,采集完成后的數據入庫時延如圖3所示,橫坐標為測試次數,縱坐標為數據錄入時間(單位:min)。雖然對數據采集與保存本身沒影響,但30min左右的數據入庫時間是無法容忍的。2)對于長時間的數據采集任務,有內存耗盡的潛在問題。
這里提出兩種解決方案。1)對大批量數據入庫操作進行優化,縮短數據錄取時間;2)優化數據庫單次插入數據的延時,采用多線程技術在數據采集的同時完成數據的入庫工作。

圖3 批量數據入庫時間
在數據庫管理系統中,事務(Transaction)被定義為對特定數據庫的一組SQL操作,這組對數據庫的操作要么全部執行,要么都不執行。在SQLite中每一條INSERT/UPDATE語句都默認的被當作一個事務被執行,每一次執行就涉及一次數據庫的打開-寫數據庫-關閉數據庫的操作,因此大大延長了數據庫操作的時間。因此,可以將批量的INSERT/UPDATE語句顯式的定義為一組事務,代碼如下所示:

圖4為使用事務處理批量插入后的系統數據錄入所需的時間。
對比圖3可以看出,使用事務處理后,系統的數據錄入時間縮短到優化前的約1/900。以達到用戶可接受的范圍。

圖4 采用事務后批量數據入庫時間
SQLite的同步(synchronous)選項相當于一種同步IO機制,所有對數據庫的修改都必須等待本次操作寫入到磁盤上后才返回。當頻繁的對數據庫進行INSERT/UPDATE時,可以選擇關閉同步選項,進一步提高數據入庫的速度:

圖5是關閉同步選項前后,批量數據錄入時間的對比。
可以看到關閉同步選項后,數據錄入操作時間可再縮短100ms左右。

圖5 同步選項對批量數據錄入時間影響對比
上面針對數據采集完成后,數據批量入庫時的性能進行了優化。如果希望在數據采集的同時進行數據的入庫工作,那么可以組合使用關閉同步選項以及更改 SQLite默認日志模式的方式來提高單次INSERT操作的效率。SQLite中日志是在系統遇到宕機或斷電時用來恢復數據庫,保持數據庫完整性的措施,默認情況下日志是隨著對數據庫的操作一起寫入磁盤的,這里可以將其修改為內存記錄模式:

圖6 優化后單次數據插入時間對比

);
圖6為針對單次插入數據庫操作使用不同優化選項的測試結果。
結合以上提到的集中優化策略,向SQLite中單次插入數據的時間可以控制在0.2ms以內,是優化前的1/500。對于采樣周期為1ms的采集節點,完全能夠實現邊采樣邊入庫的操作模式。
SQLite的內存數據庫模式就是直接將數據庫創建在主存中,相對于磁盤,內存的數據讀寫速度要高出幾個數量級,將數據保存在內存中相比從磁盤上訪問能夠極大的提高應用的性能。圖7是采用內存數據庫模式時,數據入庫的時間與優化后的磁盤數據庫單次插入數據時間對比曲線。
采用內存數據庫,在不進行任何優化時的單次數據錄入時間與優化后的磁盤數據庫基本相當。因此在采集節點也可采用內存數據庫的模式實現數據的邊采集邊錄入。

圖7 內存數據庫模式數據入庫時間
以上幾點優化方法都是通過對SQLite本身進行各種優化選項的組合,從而提高其數據錄入效率來滿足實際需求。磁盤數據庫之所以操作時延長,其瓶頸在于硬盤的訪問速度。如果更換為SSD固態硬盤,其操作效率將大大提高,圖8為在SSD固態硬盤上相應的測試曲線。
使用SSD硬盤后,同樣在未經任何優化的條件下,SSD硬盤上的插入性能較傳統硬盤提高了近200倍。而經過優化后,SSD硬盤上的插入性能也提高了近2倍多。可見SSD硬盤的使用對數據庫訪問性能的提高還是很明顯的。

圖8 SSD與普通硬盤數據錄入時間對比
文中通過5點優化策略切實的提高SQLite數據庫訪問速度的方案,使SQLite數據庫的性能滿足半實物仿真實驗中實時數據錄入需求。同時也證明了SQLite在功能和性能上可以很好的取代目前使用傳統商業數據庫,解決半實物仿真系統中數據庫投入大、維護難、利用率低的問題。
[1](美)Grant Allen,Mike Owens.SQLite權威指南[M].2版.北京:電子工業出版社,2012:21-137.
[2]http://www.sqlite.org,SQLite[OL].
[3]蔡勇,王勇.嵌入式數據庫SQLite在測控系統設計中的應用[J].電子測試,2011(10):89-93.
[4]萬瑪寧,關永,韓相軍.嵌入式數據庫典型技術SQLite和Berkeley DB 的研究[J].微計算機信息,2006,22(1/2):91-93.