Thread Pools Tuning
Ignite, farklı amaçlar için kullanılan çeşitli thread poolları oluşturur ve sürdürür. Bu bölümde, daha yaygın olan internal poollardan bazılarını listeliyoruz ve nasıl özel bir pool oluşturabileceğinizi gösteriyoruz.
System Pool
System pool, SQL ve sorgu havuzuna giden diğer bazı sorgu türleri dışında cachele ilgili tüm işlemleri gerçekleştirir. Ayrıca bu havuz, compute görevlerinin iptal işlemlerini işlemekten sorumludur.
Varsayılan havuz boyutu max(8, toplam çekirdek sayısı)
. Havuz boyutunu değiştirmek için programlama dilinizden IgniteConfiguration.setSystemThreadPoolSize(…)
veya benzer bir API kullanın.
Queries Pool
Queries pool, cluster genelinde gönderilen ve yürütülen tüm SQL, Scan ve SPI sorgularıyla ilgilenir.
Varsayılan havuz boyutu max(8, toplam çekirdek sayısı)
. Havuz boyutunu değiştirmek için programlama dilinizden IgniteConfiguration.setQueryThreadPoolSize(…)
veya benzer bir API kullanın.
Public Pool
Public pool, Compute Grid'in iş gücüdür. Tüm hesaplamalar bu havuz tarafından alınır ve işlenir.
Varsayılan havuz boyutu max(8, toplam çekirdek sayısı)
. Havuz boyutunu değiştirmek için programlama dilinizden IgniteConfiguration.setPublicThreadPoolSize(…)
veya benzer bir API kullanın.
Service Pool
Service Grid çağrıları, hizmetlerin thread havuzuna gider. Service ve Compute bileşenleri için ayrılmış havuzlara sahip olmak, bir service implementasyonu bir hesaplamayı çağırmak istediğinde veya tam tersi olduğunda thread pool starvation ve deadlockları önlememize olanak tanır.
Varsayılan havuz boyutu max(8, toplam çekirdek sayısı)
. Havuz boyutunu değiştirmek için programlama dilinizden IgniteConfiguration.setServiceThreadPoolSize(…)
veya benzer bir API kullanın.
Striped Pool
Striped pool, işlemlerin yürütülmesini kaynaklar için birbiriyle rekabet etmeyen birden çok şerite yayarak temel cache işlemlerini ve transactionlarını hızlandırmaya yardımcı olur.
Varsayılan havuz boyutu max(8, toplam çekirdek sayısı)
. Havuz boyutunu değiştirmek için programlama dilinizden IgniteConfiguration.setStripedPoolSize(…)
veya benzer bir API kullanın.
Data Streamer Pool
Data streamer pool, IgniteDataStreamer
'dan ve dahili olarak IgniteDataStreamer
kullanan çeşitli streaming adaptörlerinden gelen tüm mesajları ve istekleri işler.
Varsayılan havuz boyutu max(8, toplam çekirdek sayısı)
. Havuz boyutunu değiştirmek için programlama dilinizden IgniteConfiguration.setDataStreamerThreadPoolSize(…)
veya benzer bir API kullanın.
Snapshot Pool
Snapshot pool, Apache Ignite anlık görüntülerini alma veya geri yükleme ile ilgili tüm cluster işlemlerini işlemek için kullanılır.
Varsayılan havuz boyutu 4
'tür (bkz. IgniteConfiguration.DFLT_SNAPSHOT_THREAD_POOL_SIZE
). Havuz boyutunu değiştirmek için IgniteConfiguration.setSnapshotThreadPoolSize(…)
öğesini kullanın.
Creating Custom Thread Pool
Compute görevleri için özel bir thread pool yapılandırmak mümkündür. Deadlocklardan eşzamanlı olarak kaçınarak bir compute görevini(task) diğerinden yürütmek istiyorsanız bu kullanışlıdır. Bunu garanti etmek için, iç içe geçmiş bir görevin, ebeveynin görevler thread poolundan ayrı bir thread poolunda yürütüldüğünden emin olmanız gerekir.
IgniteConfiguration
'da özel bir pool tanımlanmıştır ve benzersiz bir ada sahip olmalıdır:
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="executorConfiguration">
<list>
<bean class="org.apache.ignite.configuration.ExecutorConfiguration">
<property name="name" value="myPool"/>
<property name="size" value="16"/>
</bean>
</list>
</property>
</bean>
Şimdi, yukarıda tanımlanan myPool
'dan bir threadde aşağıdaki hesaplama görevini yürütmek istediğinizi varsayalım:
public class InnerRunnable implements IgniteRunnable {
@Override
public void run() {
System.out.println("Hello from inner runnable!");
}
}
Bunu yapmak için, aşağıda gösterildiği gibi görevi hemen üst görevden yürütecek olan IgniteCompute.withExecutor()
'u kullanın:
public class OuterRunnable implements IgniteRunnable {
@IgniteInstanceResource
private Ignite ignite;
@Override
public void run() {
// Synchronously execute InnerRunnable in a custom executor.
ignite.compute().withExecutor("myPool").run(new InnerRunnable());
System.out.println("outer runnable is executed");
}
}
Ana görevin yürütmesi şu şekilde tetiklenebilir ve bu senaryoda public pool tarafından yürütülür:
ignite.compute().run(new OuterRunnable());
Bir uygulama, node’un yapılandırmasında tanımlanmayan custom bir poolda bir hesaplama görevi yürütmeye çalışırsa, loglara özel bir uyarı mesajı yazdırılır ve görev, yürütülmek üzere public pool tarafından alınır.