Ana içeriğe geç
Version: 1.0.1

Persistence Tuning

Adjusting Page Size

DataStorageConfiguration.pageSize parametresi, depolama ortamının (SSD, Flash, HDD vb.) sayfa boyutundan ve işletim sisteminin cacge sayfa boyutundan küçük olmamalıdır. Varsayılan değer 4KB'dir.

İşletim sisteminin cache sayfası boyutu, sistem araçları ve parametreleri kullanılarak kolayca kontrol edilebilir.

SSD gibi bir depolama aygıtının sayfa boyutu genellikle aygıt özelliklerinde belirtilir. Üretici bu bilgiyi açıklamazsa, sayıyı bulmak için SSD benchmarklarına bakılabilir. Birçok üretici, sürücülerini 4KB random-write iş yüklerine uyarlamak zorundadır, çünkü çeşitli standart benchmarklar varsayılan olarak 4KB kullanır. Intel'den gelen bu yazı, 4KB'nin yeterli olması gerektiğini doğrulamaktadır.

En uygun sayfa boyutunu seçtikten sonra, bunu cluster konfigürasyonuna uygulayın:

  • ⌨️ XML Config;
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements. See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    -->
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">

    <!-- Set the page size to 8 KB -->
    <property name="pageSize" value="#{8 * 1024}"/>
    </bean>
    </property>
    </bean>
    </beans>
  • ⌨️ .NET Config;
    var cfg = new IgniteConfiguration
    {
    DataStorageConfiguration = new DataStorageConfiguration
    {
    // Changing the page size to 4 KB.
    PageSize = 4096
    }
    };

Keep WALs Separately

Veri dosyaları ve Write Ahead Logging (WAL) için ayrı sürücüler kullanmayı düşünün. Ignite aktif olarak hem verilere hem de WAL dosyalarına yazar.

Aşağıdaki örnek, veri depolama, WAL ve WAL arşivi için ayrı yolların nasıl yapılandırılacağını gösterir:

  • ⌨️ XML Config;
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements. See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    -->
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">

    <!--
    Sets a path to the root directory where data and indexes are
    to be persisted. It's assumed the directory is on a separated SSD.
    -->
    <property name="storagePath" value="/opt/persistence"/>
    <property name="walPath" value="/opt/wal"/>
    <property name="walArchivePath" value="/opt/wal-archive"/>
    </bean>
    </property>
    </bean>
    </beans>
  • ⌨️ .NET Config;
    var cfg = new IgniteConfiguration
    {
    DataStorageConfiguration = new DataStorageConfiguration
    {
    // Sets a path to the root directory where data and indexes are to be persisted.
    // It's assumed the directory is on a separated SSD.
    StoragePath = "/ssd/storage",

    // Sets a path to the directory where WAL is stored.
    // It's assumed the directory is on a separated HDD.
    WalPath = "/wal",

    // Sets a path to the directory where WAL archive is stored.
    // The directory is on the same HDD as the WAL.
    WalArchivePath = "/wal/archive"
    }
    };

Increasing WAL Segment Size

Varsayılan WAL segment boyutu (64 MB), WAL'ın segmentler arasında çok sık geçiş yapmasına neden olduğundan ve switching/rotation maliyetli bir işlem olduğundan, yüksek yük senaryolarında verimsiz olabilir. Segment boyutunun daha yüksek bir değere (2 GB'a kadar) ayarlanması switching işlemlerinin sayısını azaltmaya yardımcı olabilir. Ancak handikap, bunun WAL’ın toplam hacmini artıracağı yönündedir.

Ayrıntılar için WAL Segment Boyutunu Değiştirme bölümüne bakınız...

Changing WAL Mode

Varsayılan moda alternatif olarak diğer WAL modlarını göz önünde bulundurun. Her mod, düğüm arızası durumunda farklı derecelerde güvenilirlik sağlar ve bu derece hız ile ters orantılıdır, yani WAL modu ne kadar güvenilirse, o kadar yavaştır. Bu nedenle, kullanım durumunuz yüksek güvenilirlik gerektirmiyorsa daha az güvenilir bir moda geçebilirsiniz.

Daha fazla ayrıntı için WAL Modlarına bakınız…

Disabling WAL

WAL'ı devre dışı bırakmanın performansı iyileştirmeye yardımcı olabileceği durumlar vardır.

Pages Writes Throttling

Ignite, kirli sayfaları bellekten diske eşitleyen checkpoint oluşturma sürecini düzenli aralıklarla başlatır. Kirli sayfa, RAM'de güncellenen ancak ilgili partition dosyasına yazılmamış bir sayfadır (örn. bir güncelleme WAL'a yeni eklenmiştir). Bu işlem, uygulamanın mantığını etkilemeden arka planda gerçekleşir.

Ancak, checkpoint için zamanlanan kirli bir sayfa diske yazılmadan önce güncellenirse, önceki durumu checkpoint bugger adı verilen özel bir bölgeye kopyalanır. Buffer taşarsa, Ignite checkpointing bitene kadar tüm güncellemeleri işlemeyi durduracaktır. Sonuç olarak, bu şemada gösterildiği gibi, checkpoint döngüsü tamamlanana kadar yazma performansı sıfıra düşebilir:

checkpointing-chainsaw.png

Checkpoint devam ederken kirli sayfalar tresholduna(eşiğine) tekrar ulaşılırsa aynı durum oluşur. Bu, Ignite'ı bir checkpoint yürütmesi daha planlamaya ve ilk checkpoint döngüsü bitene kadar tüm güncelleme işlemlerini durdurmaya zorlayacaktır.

Her iki durum da genellikle bir disk aygıtı yavaş olduğunda veya güncelleme hızı çok yoğun olduğunda ortaya çıkar. Bu performans düşüşlerini azaltmak ve önlemek için sayfaların yazma kısıtlama algoritmasını(write throttling algorithm) etkinleştirmeyi düşünün. Algoritma, checkpoint buffer’ı çok hızlı dolduğunda veya kirli sayfaların yüzdesi hızla arttığında, güncelleme işlemlerinin performansını disk cihazının hızına düşürür.

Aşağıdaki örnek, yazma kısıtlamasının(write throttling) nasıl etkinleştirileceğini gösterir:

  • ⌨️ XML Config;
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements. See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    -->
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">

    <property name="writeThrottlingEnabled" value="true"/>

    </bean>
    </property>
    </bean>
    </beans>
  • ⌨️ .NET Config;
    var cfg = new IgniteConfiguration
    {
    DataStorageConfiguration = new DataStorageConfiguration
    {
    WriteThrottlingEnabled = true
    }
    };

Adjusting Checkpointing Buffer Size

Önceki bölümde açıklanan checkpoint buffer boyutu, checkpoint süreci tetikleyicilerinden biridir.

Varsayılan buffer boyutu, veri bölgesi(data region) boyutunun bir fonksiyonu olarak hesaplanır:

Veri Bölgesi BoyutuVarsayılanCheckpointing Buffer Boyutu
< 1 GBMIN (256 MB, Data_Region_Size)
1 GB ve 8 GB arasındaData_Region_Size / 4
> 8 GB2 GB

Varsayılan buffer boyutu, yazma açısından yoğun iş yükleri için yetersiz olabilir çünkü sayfa write throttling algoritması, boyut kritik düzeye ulaştığında yazma işlemlerinizi yavaşlatacaktır. Checkpointing devam ederken yazma performansını istenen hızda tutmak için DataRegionConfiguration.checkpointPageBufferSize değerini artırmayı ve performans düşüşlerini önlemek için yazma kısıtlamasını etkinleştirmeyi düşünün:

  • ⌨️ XML Config;
    <?xml version="1.0" encoding="UTF-8"?>
    <!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements. See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License. You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    -->
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <bean class="org.apache.ignite.configuration.IgniteConfiguration">
    <property name="dataStorageConfiguration">
    <bean class="org.apache.ignite.configuration.DataStorageConfiguration">

    <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 1 GB. -->
    <property name="checkpointPageBufferSize" value="#{1024L * 1024 * 1024}"/>
    </bean>
    </property>

    </bean>
    </property>
    </bean>
    </beans>
  • ⌨️ .NET Config;
    var cfg = new IgniteConfiguration
    {
    DataStorageConfiguration = new DataStorageConfiguration
    {
    WriteThrottlingEnabled = true,
    DefaultDataRegionConfiguration = new DataRegionConfiguration
    {
    Name = DataStorageConfiguration.DefaultDataRegionName,
    PersistenceEnabled = true,

    // Increasing the buffer size to 1 GB.
    CheckpointPageBufferSize = 1024L * 1024 * 1024
    }
    }
    };

Yukarıdaki örnekte, varsayılan bölgenin checkpoint buffer boyutu 1 GB olarak ayarlanmıştır.

Enabling Direct I/O

Genellikle, bir uygulama diskten veri okuduğunda, işletim sistemi verileri alır ve önce bir dosya bufferına koyar. Benzer şekilde, her yazma işlemi için işletim sistemi önce verileri cache’e yazar ve daha sonra diske aktarır. Bu işlemi ortadan kaldırmak için Doğrudan I/O'yu etkinleştirebilirsiniz; bu durumda veriler dosya buffer cache’ini atlayarak doğrudan diskten/diske yazılır ve okunur.

Ignite'daki Direct I/O modülü, kirli sayfaları RAM'den diske yazan checkpoint işlemini hızlandırmak için kullanılır. Yoğun yazma gerektiren iş yükleri için Doğrudan I/O eklentisini kullanmayı düşünün.

Doğrudan I/O'nun özellikle WAL dosyaları için etkinleştirilemeyeceğini unutmayın. Bununla birlikte, Doğrudan I/O modülünün etkinleştirilmesi, WAL dosyalarıyla ilgili olarak da küçük bir fayda sağlar: WAL verileri, OS buffer cache’inde çok uzun süre depolanmayacaktır; sonraki sayfa cache taramasında temizlenir (WAL moduna bağlı olarak) ve sayfa cache’inden kaldırılır.

Direct I/O'yu etkinleştirebilir, {IGNITE_HOME}/libs/optional/ignite-direct-io klasörünü Ignite dağıtımınızda üst düzey libs/optional/ignite-direct-io klasörüne taşıyabilir veya burada anlatıldığı gibi Maven bağımlılığı olarak kullanabilirsiniz.

Çalışma zamanında eklentiyi etkinleştirmek veya devre dışı bırakmak için IGNITE_DIRECT_IO_ENABLED sistem özelliğini kullanabilirsiniz.

Ayrıntılar için Ignite Direct I/O Wiki bölümünden faydalanabilirsiniz…

Purchase Production-Level SSDs

Ignite Native Persistence performansının, *SSD'lerin tasarlanma ve çalışma şekli* nedeniyle birkaç saatlik yoğun yazma yükünden sonra düşebileceğini unutmayın. Performansı yüksek tutmak için hızlı, production level SSD'ler satın almayı veya Intel Optane Persistent Memory gibi geçici olmayan bellek aygıtlarına geçmeyi düşünün.

SSD Over-provisioning

%50 dolu bir diskte rastgele yazma performansı, SSD'lerin over-provisioning nedeniyle %90 dolu bir diske göre çok daha iyidir.

Daha yüksek over-provisioning oranlarına sahip SSD'ler satın almayı düşünün ve üreticinin bunu ayarlamak için araçlar sağladığından emin olun.

Düşük over-provisioning ayarı ve SSD düzeyinde sürekli garbage collection’un neden olduğu darboğazlardan kaçınmak için normal SSD'ler yerine Intel 3D XPoint sürücüleri kullanmayı düşünün. Daha fazlasını buradan okuyun.