долгое время, когда получаю ответ Даббо

Странная проблема. из-за отсутствия очевидного индекса производительности, поэтому я здесь для разных идей. Описываю подробности проблемы. Я разрабатываю службу RPC с фреймворком Dubbo(версия 2.6.6) и провожу тестирование производительности.

Процессоры: 8vcore

Память: 16 ГБ (всего) -Xms5g -Xmx5g

результат испытаний:

       users     TPS    average-response-time  cpu                  memory     disk-io         
2000      2208          894ms           30%(single-avg)        42%      824    
1000      2071        476ms             30%(single-avg)        42%      849      
500       1863        250               27%(single-avg)        42%      410          
200       1734        105               26%(single-avg)        42%      340

данные контекстного переключателя:

2000-пользователей

1000 пользователей

500-пользователей

200-пользователей

Судя по этим данным, памяти процессора,disk-io и переключению контекста процессора, все эти индексы в порядке, но по мере увеличения количества пользователей TPS не увеличивается существенно, но значительно увеличивается среднее время отклика.

Так в чем же проблема, я что-то знал о блокировке или о очереди блокировок, как проверить размер очереди блокировок? Есть ли какой-нибудь инструмент для этого? почему среднее время отклика стоит столько времени?

КЛЮЧЕВОЙ КОД из dubbo framework com.alibaba.dubbo.remoting.exchange.support.DefaultFuture

       @Override
    public Object get() throws RemotingException {
        return get(timeout);
    }

    # THIS METHOD COST MUCH TIME!!!!
    @Override
    public Object get(int timeout) throws RemotingException {
        if (timeout <= 0) {
            timeout = Constants.DEFAULT_TIMEOUT;
        }
        if (!isDone()) {
            long start = System.currentTimeMillis();
            lock.lock();
            try {
                while (!isDone()) {
                    done.await(timeout, TimeUnit.MILLISECONDS);
                    if (isDone() || System.currentTimeMillis() - start > timeout) {
                        break;
                    }
                }
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
            if (!isDone()) {
                throw new TimeoutException(sent > 0, channel, getTimeoutMessage(false));
            }
        }
        return returnFromResponse();
    }

0 ответов

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