4

У меня есть пример использования производительности, с помощью которого мне нужно идентифицировать определенные вызовы process() в EntryProcessor, которые занимают более 300 миллисекунд. Я попытался использовать SlowOperationDetector со следующей конфигурацией.Hazelcast SlowOperationDetector для определения операций с временем выполнения менее 1 секунды

<!-- SlowOperation Detector Configuration --> 
    <property name="hazelcast.slow.operation.detector.enabled">true</property> 
    <property name="hazelcast.slow.operation.detector.stacktrace.logging.enabled">true</property> 
    <property name="hazelcast.slow.operation.detector.log.purge.interval.seconds">60000</property> 
    <property name="hazelcast.slow.operation.detector.log.retention.seconds">60000</property> 
    <property name="hazelcast.slow.operation.detector.threshold.millis">300</property> 

Я дал код тестового образца, который спит в течение 1 секунды внутри process().

public static void main(String args[]) 
{ 
    Config cfg = null; 
    try { 
     cfg = new FileSystemXmlConfig("C:\\workarea\\hazelcast\\hazelcast-perf.xml"); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    HazelcastInstance hazelcastInstance = Hazelcast.newHazelcastInstance(cfg); 
    IMap<String, Employee> employeesMap = hazelcastInstance.getMap("anyMap"); 
    employeesMap.put("100", new Employee(100)); 
    SlowEntryProcessor slowEntryProcessor = new SlowEntryProcessor(); 
    employeesMap.executeOnKey("100", slowEntryProcessor); 

} 

static public class SlowEntryProcessor implements EntryProcessor<String, Employee> 
{ 

    private static final long serialVersionUID = 1L; 

    @Override 
    public EntryBackupProcessor<String, Employee> getBackupProcessor() 
    { 
     return null; 
    } 

    @Override 
    public Object process(Entry<String, Employee> arg0) 
    { 
     System.out.println("About to sleep"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("done processing"); 
     return null; 
    } 

} 

Я не вижу никаких журналов, когда настроенный порог меньше 1000 мс. Поэтому в этом примере я не вижу трассировки стека медленной работы или журналов.

Если я изменяю время сна на 2 сек и медленный рабочий порог до 1 с, срабатывает детектор медленной работы и регистрируются журналы.

Это ошибка в SlowOperationDetector или я что-то упустил?

ответ

2

Это не ошибка; но дизайн. Мы периодически проверяем текущие выполняемые операции. Это зависит от частоты сканирования. Детектор медленной работы не предназначен для использования (и поэтому не предназначен) для обнаружения таких коротких операций. Он действительно предназначен для многократного выполнения операции.

+0

привет, спасибо за помощь. Вы видите какой-либо другой способ достичь этого с помощью hz? У меня есть процессор ввода, который получает запрос 10 раз в запросе. Из-за большего количества вызовов (которые я не могу уменьшить) даже 300 мс становится большой сделкой, так как она составляет ~ 3 сек. В целом, как вы анализируете производительность EPE-рендеринга? – Dinesh