Как я могу предотвратить тонны апачского порождения процессов, когда я запускаю апача и продолжающий уничтожать мою машину?

Существует прекрасное объяснение этой проблемы Andrei Pangin , датированное 07 апреля 2015 года. Здесь доступно , но оно написано на русском языке (я предлагаю просмотрите образцы кода в любом случае - они являются международными). Общая проблема - это блокировка во время инициализации класса.

Вот некоторые цитаты из статьи:


Согласно JLS , каждый класс имеет уникальную блокировку инициализации который фиксируется во время инициализации. Когда другой поток пытается получить доступ к этому классу во время инициализации, он будет заблокирован в блокировке до завершения инициализации. Когда классы инициализируются одновременно, можно получить тупик.

Я написал простую программу, которая вычисляет сумму целых чисел, что она должна печатать?

public class StreamSum {
    static final int SUM = IntStream.range(0, 100).parallel().reduce((n, m) -> n + m).getAsInt();

    public static void main(String[] args) {
        System.out.println(SUM);
    }
} 

Теперь удалите parallel() или заменить лямбда на вызов Integer::sum - что изменится?

Здесь мы снова увидим тупик [были некоторые примеры блокировок в инициализаторах класса, ранее описанных в этой статье]. Из-за операций потока parallel() выполняется в отдельном пуле потоков. Эти потоки пытаются выполнить тело лямбда, которое записывается в байт-код как метод private static внутри класса StreamSum. Но этот метод не может быть выполнен до завершения статического инициализатора класса, который ждет результатов завершения потока.

Что более разумно: этот код работает по-разному в разных средах. Он будет корректно работать на одном процессоре и, скорее всего, будет работать на многопроцессорной машине. Это различие связано с реализацией пула Fork-Join. Вы можете сами убедиться, что вы изменяете параметр -Djava.util.concurrent.ForkJoinPool.common.parallelism=N

57
задан Darryl Hein 25 February 2009 в 22:44
поделиться

4 ответа

Вы, вероятно, совершили ошибку конфигурирования Apache для использования намного больше, чем весь поршень. Это - легкая ошибка сделать.

я предполагаю, что Вы используете Apache Перед ветвлением и незавершенный сервер приложений (такой как PHP или mod_perl). В этой модели Вы закончите с максимумом (MaxClients * макс. использование памяти Вашего приложения для каждого процесса) используемая память. Если у Вас нет почти так многого, пора уменьшиться один, другой или оба.

В общем случае, это означает уменьшать MaxClients до такой степени, когда, Ваш сервер имеет достаточно поршня для привыкания.

значения по умолчанию, обычно используемые для MaxClients (150 типично), не подходят для выполнения незавершенного тяжелого сервера приложений на скромной машине при использовании модели Prefork (Большинство серверов приложений или не поддерживает или препятствует, использование потоковых моделей).

Однако уменьшающийся MaxClients в конечном счете заставит приложение становиться недоступным, особенно если у Вас будут сообщения проверки активности на и тайм-аут проверки активности слишком долго. Процессы, которые просто поддерживают соединение (указывают K в состоянии сервера) все еще используют много RAM, и это может быть проблемой - пытаются минимизировать тайм-аут проверки активности или выключить его в целом.

необходимо следить за состоянием сервера (в соответствии с mod_status).

, Конечно, необходимо только внести ЛЮБОЕ из этих изменений, если Вы понимаете последствия. Думайте дважды, измените конфигурацию однажды. Если у Вас есть способность протестировать изменения с моделируемой нагрузкой на подобную непроизводственную машину спецификации, сделайте так.

42
ответ дан MarkR 7 November 2019 в 16:09
поделиться

Вы недавно изменили свой конфигурационный файл? Если да, я полагаю, что Вы сохраняете старую версию для diffing?

В противном случае ищут "StartServers", "MaxSpareServers" и директивы "MinSpareServers". Обычно Вы хотите оставить их в значениях по умолчанию, но возможно, что они были намеренно установлены высоко (плохая идея) или случайно установили тот путь из-за плохого редактирования конфигурации.

, Если это не помогает, пора посмотреть вне Apache для некоторого процесса, который это открывает, соединения на высокой скорости (мог быть то, что существует процесс тестирования, это взбесилось).

Первый шаг является журналом доступа. Второй шаг должен выполнить netstat, для наблюдения, куда соединения могли бы прибывать из. И если это работает на той же системе, можно посмотреть в/proc / */fd для нахождения двух концов соединения.

11
ответ дан kdgregory 7 November 2019 в 16:09
поделиться

Как был сказан (принятие Apache Перед ветвлением) - MaxClients = макс. обрабатывает сразу.

, Если Вы находите, Вы становитесь прибитыми с реальным трафиком (и не неправильно сконфигурированный StartServers/Min/MaxSpareServers), существуют некоторые другие вещи, которые можно сделать:

  1. Настроенный отдельный, легкий апачский процесс (или lighttpd) для Вашего статического содержания. Тем путем весь маленький, статический материал не "загрязняет" Ваш тяжелый процесс приложения. Это может быть на том же сервере или другом. Не имеет значения.
  2. Помещенный обратный прокси как Сквид перед Вашим процессом Apache. Обратный прокси быстро высосет вниз содержание из Apache и сохранит его в памяти и затем пакете, это отступает клиенту. Таким образом, пользователи AOL на модемах 14.4 КБ не делают пожирателя ресурсов один из Ваших ценных слотов Apache. В качестве награды такая установка может быть настроена для кэширования части содержания для сокращения нагрузки на процессы Apache.
3
ответ дан Cory R. King 7 November 2019 в 16:09
поделиться

Ваш «верхний» вывод показывает, что у вас достаточно свободной памяти, поэтому я не думаю, что MaxClients является проблемой (если нет проблем с выделением Apache более 2 ГБ памяти? ) В вашем журнале ошибок должны отображаться ошибки, если возникают проблемы с созданием дополнительных потомков.

Скорее всего, ваши процессы Apache действительно используют много ресурсов. Если вы используете приложения PHP, попробуйте установить eAccelerator, который хорошо выполняет оптимизацию и кэширование кода PHP. Другие вещи могут включать в себя тяжелые запросы MySQL, медленный преобразователь DNS и т. Д. Кроме того, он помогает лучше понять, какие программы поражены и что они делают.

2
ответ дан 24 November 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: