Как заставить 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 (;;) {
}
}
}