在本章中,可以了解一些關於如何優化使用OrientDB的應用程式的一般技巧。 有三種方法可以提高不同型別資料庫的效能。
可以通過更改記憶體,JVM和遠端連線設定來實現通用效能調整。
記憶體設定有不同的策略來提高效能。
伺服器和嵌入式設定
通過直接使用plocal
,這些設定對於Java應用程式在嵌入模式下使用OrientDB執行的伺服器元件和JVM都有效。
調整最重要的是確保記憶體設定是正確的。 真正區別的是在記憶體對映所使用的堆和虛擬記憶體之間進行正確的平衡,特別是在記憶體快取結構計數少於原始IO的大型資料集(GB
,TB
等)時。
例如,如果您最多可以為Java進程分配8GB,那麼分配小堆和大型磁碟快取緩衝區(堆記憶體儲器)通常會更好。
嘗試以下命令以增加堆記憶體。
java -Xmx800m -Dstorage.diskCache.bufferSize=7200 ...
storage.diskCache.bufferSize
設定(使用舊的local
儲存為file.mmap.maxMemory
)以MB為單位,並指出要為磁碟快取記憶體元件使用多少記憶體。 預設情況下它是4GB
。
註 - 如果最大堆和磁碟快取記憶體緩衝區的總和過高,則可能導致作業系統以極大的減速進行交換。
JVM設定在server.sh
(和server.bat
)批次處理檔案中編碼。可以根據您的使用情況和硬體/軟體設定更改它們以調整JVM。 在server.bat
檔案中新增以下行。
-server -XX:+PerfDisableSharedMem
該設定將禁止編寫有關JVM的偵錯資訊。 如果需要組態JVM,只需刪除此設定即可。
使用遠端連線存取資料庫時,有許多方法可以提高效能。
獲取策略
當您使用遠端資料庫時,必須注意所使用的獲取策略。 預設情況下,OrientDB用戶端僅載入結果集中包含的記錄。 例如,如果查詢返回100個元素,但是如果您從用戶端跨越這些元素,則OrientDB用戶端會延遲地將這些元素載入到伺服器的每個丟失記錄的網路呼叫中。
網路連線池
預設情況下,每個用戶端只使用一個網路連線與伺服器交談。 同一用戶端上的多個執行緒共用同一個網路連線池。
當您有多個執行緒時,可能會有一個瓶頸,因為等待免費網路連線花費了大量時間。 這就是組態網路連線池非常重要的原因。
組態非常簡單,只需2
個引數 -
minPool
- 它是連線池的初始大小。 預設值被組態為全域性引數client.channel.minPool
。maxPool
- 這是連線池可以達到的最大大小。 預設值被組態為全域性引數client.channel.maxPool
。如果所有池連線都忙,則用戶端執行緒將等待第一個空閒連線。
使用資料庫屬性進行組態的範例命令。
database = new ODatabaseDocumentTx("remote:localhost/demo");
database.setProperty("minPool", 2);
database.setProperty("maxPool", 5);
database.open("admin", "admin");
有許多方法可以提高分散式組態的效能。
使用事務
即使更新圖表,也應該始終處理事務。常見情況是唯讀查詢,如果發生故障,可以恢復大量和非並行操作。 在分散式組態上執行時,使用事務有助於減少延遲。 這是因為分散式操作只發生在提交時。 由於延遲,分配一個大的操作比傳送小的多個操作要有效得多。
複製vs分片
OrientDB分散式組態設定為完全複製。 具有多個具有相同資料庫副本的節點對於讀取尺度很重要。 事實上,每個伺服器都獨立於執行讀取和查詢。 如果有10個伺服器節點,則讀取吞吐量為10倍。
寫入後,情況正好相反:如果複製是同步的,則具有完全複製的多個節點會減慢操作速度。 在這種情況下,跨多個節點分割資料庫允許您擴充套件寫入,因為寫入時只涉及一部分節點。 此外,您可以擁有一個比一個伺服器節點HD更大的資料庫。
在寫入時放大
如果網路速度較慢,並且您有一個同步(預設)複製,則可以支付延遲成本。 事實上,當OrientDB同步執行時,它至少等待writeQuorum
。 這意味著如果writeQuorum
為3
,並且您有5個節點,則協調器伺服器節點(啟動分散式操作的位置)必須等待來自至少3
個節點的答案才能向用戶端提供答案。
為了保持一致性,writeQuorum
應該被設定為majority
。 如果您有5
個節點,則majority
為3
,使用4
個節點時,它仍然為3
。將writeQuorum
設定為3
而不是4
或5
可以降低延遲成本並保持一致性。
非同步複製
為了加快速度,可以設定非同步複製來消除延遲瓶頸。 在這種情況下,協調器伺服器節點在本地執行操作並將答案提供給用戶端。 整個複製將在後台進行。 如果未達到法定人數,則更改將透明回滾。
在讀取上放大
如果您已經將writeQuorum
設定為majority
節點,則可以將readQuorum
保留為1
(預設值)。 這加快了所有的讀取。