1,配置文件調優
1.1 設置頁面大小(pagesize)
先查看系統pagesiz,使用PAGE_SIZE或者PAGESIZE
# getconf PAGE_SIZE
4096
# getconf PAGESIZE
4096
ignite默認配置是4k,也就是4096,如果服務器和ignite默認配置不一致,那么就得在配置文件中指定:
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
.......
<!-- Set the page size to 4 KB -->
<property name="pageSize" value="#{4 * 1024}"/>
.......
</bean>
</property>
</bean>
1.2 增加WAL段大小
WAL段的默認大小(64MB)在高負載情況下可能是低效的,因為它導致WAL在段之間頻繁切換,並且切換是有點昂貴的操作。將段大小設置為較大的值(最多2GB)可能有助於減少切換操作的次數,不過這將增加預寫日志的占用空間。
可以調整為1GB:
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
......
<!-- Size of the WAL (Write Ahead Log) segment -->
<property name="walSegmentSize" value="#{1024 * 1024 * 1024}"/>
......
</bean>
</property>
1.3 調整WAL模式
一般建議使用LOG_ONLY模式,出於對持久化和性能之間的妥協:
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<!--In our experience LOG_ONLY is a good compromise between durability and performance.-->
<property name="walMode" value="LOG_ONLY"/>
</bean>
</property>
1.4 頁面寫入優化
Ignite會定期地啟動檢查點進程,以在內存和磁盤間同步臟頁面。這個進程在后台進行,對應用沒有影響。
但是,如果由檢查點進程調度的一個臟頁面,在寫入磁盤前被更新,它之前的狀態會被復制進一個特定的區域,叫做檢查點緩沖區。如果這個緩沖區溢出,那么在檢查點處理過程中,Ignite會停止所有的更新。因此,寫入性能可能降為0。
當檢查點處理正在進行中時,如果臟頁面數達到閾值,同樣的情況也會發生,這會使Ignite強制安排一個新的檢查點執行,並停止所有的更新操作直到第一個檢查點執行完成。
當磁盤較慢或者更新過於頻繁時,這兩種情況都會發生,要減少或者防止這樣的性能下降,可以考慮啟用頁面寫入優化算法。這個算法會在檢查點緩沖區填充過快或者臟頁面占比過高時,將更新操作的性能降低到磁盤的速度。
開啟頁面寫入優化:
<!-- Enabling Ignite Native Persistence. -->
<property name="dataStorageConfiguration">
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<!-- Enable write throttling. -->
<property name="writeThrottlingEnabled" value="true"/>
</bean>
</property>
1.5 檢查點緩沖區大小
緩沖區的默認大小是根據內存區大小計算而來的值:
| 數據區大小 | 默認檢查點緩沖區大小 |
|---|---|
< 1GB |
MIN (256 MB, 數據區大小) |
1GB ~ 8GB |
數據區大小/4 |
> 8GB |
2GB |
默認的緩沖區大小並沒有為寫密集型應用進行優化,因為在大小接近標稱值時,頁面寫入優化算法會降低寫入的性能,因此在正在進行檢查點處理時,可以考慮增加DataRegionConfiguration.checkpointPageBufferSize,並且開啟寫入優化來阻止性能的下降:
<bean class="org.apache.ignite.configuration.DataStorageConfiguration">
<!-- Enable write throttling. -->
<property name="writeThrottlingEnabled" value="true"/>
<property name="defaultDataRegionConfiguration">
<bean class="org.apache.ignite.configuration.DataRegionConfiguration">
<!-- Enabling persistence. -->
<property name="persistenceEnabled" value="true"/>
<!-- Increasing the buffer size to 8 GB. -->
<property name="checkpointPageBufferSize"
value="#{8 * 1024 * 1024 * 1024}"/>
</bean>
</property>
</bean>
2, jvm調優
以10GB堆內存示例:
java8
-server
-Xms10g
-Xmx10g
###當JVM初始化時預先對Java堆進行預先摸底(Pre-touch),堆的每個頁初始化時滿足需求,而不是應用執行時遞增
-XX:+AlwaysPreTouch
###使用G1
-XX:+UseG1GC
###新生代GC優先於Full GC執行
-XX:+ScavengeBeforeFullGC
###禁止調用System.gc();但jvm的gc仍然有效
-XX:+DisableExplicitGC
具體調整方式為修改啟動腳本ignite.sh:
#
# Uncomment the following GC settings if you see spikes in your throughput due to Garbage Collection.
#
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
JVM_OPTS="$JVM_OPTS -XX:+AlwaysPreTouch -XX:+ScavengeBeforeFullGC -XX:+DisableExplicitGC"
添加gc日志收集:
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/apache-ignite-2.7.0-bin/heapdump -XX:+ExitOnOutOfMemoryError"
JVM_OPTS="$JVM_OPTS -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintAdaptiveSizePolicy"
JVM_OPTS="$JVM_OPTS -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M -Xloggc:/data/apache-ignite-2.7.0-bin/gc.log"
參考鏈接:
https://liyuj.gitee.io/doc/java/ProductionReadiness.html#_11-4-2-與原生持久化有關的調優
