Hazelcast SlowOperationDetector для идентификации операций с временем выполнения менее 1 секунды

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

    <!-- 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 или я что-то здесь упускаю?

1 ответ

Решение

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

Другие вопросы по тегам