Posted on 2010-11-03 11:01
S.l.e!ep.¢% 閱讀(1378)
評論(0) 編輯 收藏 引用 所屬分類:
FastDB
最近項目中使用了fast db,為了提高訪問效率,fast db采用diskless模式編譯。
共享內存的最大尺寸受系統參數限制,
下面數據是在Linux im_monitor 2.6.9-42.ELsmp 下的缺省值:
cat /proc/sys/kernel/shmmax
33554432
默認大小都是32M;
同樣fastdb里的代碼也用32M作為容量上限,而且一旦越界,不再進行擴容;進程退出;
具體的代碼行是:inc/database.h 文件里
#ifdef DISKLESS_CONFIGURATION
// In diskless confiuration database can not be reallocated
const size_t dbDefaultInitDatabaseSize = 32*1024*1024;
#else
const size_t dbDefaultInitDatabaseSize = 1024*1024;
#endif
為了支持fastdb在更大的共享內存下工作,需要做兩點修改:
1、系統參數的修改
修改 /etc/sysctl.cfg,添加入下內容:
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 1073741824
sysctl -p 執行;
或者echo 1073741824 > /proc/sys/kernel/shmmax ,注意需要加到啟動腳本里去;
2、修改fastdb源代碼
const size_t dbDefaultInitDatabaseSize = 32*1024*1024;修改為合適的數值;比如32->1024
鑒于共享內存大小限制,以及不能動態擴容:當容量超過限制,進程不能進行再分配,直接退出,對于大容量的系統,對fastdb的數據使用超過2G, 或者總的虛擬內存使用量可能接近3G, 則不建議在32位操作系統中使用共享內存方式的fastdb,可以改用文件方式,實際上對于文件方式,也是通過mmap的方式來實現,對于io的寫基本等同于內存效率,且可以在預分配的基礎上擴容。