Ana içeriğe geç
Version: 1.0.1

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.