Как заставить WebLogic использовать все процессоры на многопроцессорной машине

Вчера мы заметили своеобразное поведение с Java/Web Logic на одном из наших многопроцессорных серверов, поэтому хотели подумать об этом.

По какой-то причине в Web Logic/Java используется только один процессор из двух доступных процессоров. Когда мы работали с большой нагрузкой, я видел, что процессор на одном из них достигает почти 100%, а другой процессор полностью простаивает. Имеет ли значение, если это виртуальная машина (но это не виртуальная машина)

Интересно, что любые другие действия ОС указывают на активность процессора на обоих.

С уважением, _UB

3 ответа

Решение

В обычных сценариях WebLogic (и, следовательно, Java) должен иметь возможность использовать все доступные процессоры на сервере, на котором он работает. В WebLogic есть пул потоков обработки запросов, и когда запросы поступают одновременно, они обрабатываются одновременно. Если на сервере установлено несколько процессоров, они должны использоваться потоками Java.

Если веб-приложение Java, работающее в WebLogic, использует в своем сервлете (-ах) SingleThreadModel, никакие два потока не могут выполнять сервлет одновременно, и, таким образом, вы могли видеть только один процессор в работе. Эта модель не рекомендуется, и я думаю, что так или иначе не очень используется.

Я слышал, как некоторые люди жалуются на то, что они не могут заставить свои серверы приложений Java использовать более 1 ЦП при запуске ОС виртуальной машины, такой как VMWare, даже если они выделили более одного ЦП для ВМ. Я понятия не имею, что послужило причиной такого странного поведения.

Возможно, вам следует попытаться открыть несколько очень простых страниц JSP с одновременными запросами и посмотреть, не используется ли более 1 ЦП. Если это работает, проблема в вашем приложении.

Документы WebLogic дают советы по настройке для многопроцессорных машин. Вы бы в конечном итоге в кластерной среде.

Запустите эту Java-программу, чтобы проверить, использует ли Java все доступные процессоры (8 в моем случае):

public class MultiThreadCPUEater implements Runnable {
    public static void main(String[] args) {
        for (int i = 0; i < 8; i++) {
            MultiThreadCPUEater multiThreadCPUEater = new MultiThreadCPUEater();
            Thread thread = new Thread(multiThreadCPUEater);
            thread.start();
        }
    }

    @Override
    public void run() {
        for (;;) {
        }
    }
}
Другие вопросы по тегам