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 4

1 ответ:

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