Запуск Apache 2.4 на ядре RHEL7 3.10.0-1062, 4-х процессорный экземпляр VMWare, выполнение очень простого обратного проксирования в серверную часть WebLogic с использованием подключаемого модуля прокси WebLogic. Сервер передает только 1 МБайт / сек с парой сотен пользователей, прослушивая SSL, а также сообщая SSL с WebLogic. Конфигурация Apache очень проста, всего пара строк RewriteRule или других типичных приемников производительности. Статистика VMWare не показывает перегрузки, но также показывает загрузку гостевого ЦП на уровне 100%.
В Linux POV сервер загружен на 100%, а очередь выполнения превышает 16, а Apache использует все время процессора. Выполнение 'perf record -a -g' на минуту и создание графа пламени показывает, что в процессе httpd (с использованием 97% всего ЦП на граф пламени) мы имеем следующие удивительные случаи использования времени:
В основном, за пределами этих двух замечательных выбросов, все время выполнения тратится внутри двух вызовов libc, poll_nocancel и read_nocancel, исходящих как из цикла прослушивания apache, так и из исходящего трафика плагина WebLogic, которые, среди прочего, приводят к вызовам swapgs и readtsc.
Базовое оборудование кажется прекрасным, параметры ядра Linux кажутся прекрасными, но кажется, что фактические инструкции в секунду, выполняемые на этом сервере, очень медленные. Есть какие-нибудь советы по дальнейшему анализу с помощью инструмента perf? У меня нет доступа к серверу, поэтому я могу только предлагать команды для запуска другим.
Это ваше изображение пламени в статическом формате, обрезанное для удаления тонких глубоких стеков:
Да, многие образцы на CPU связаны с системными вызовами. Много poll () и результирующий read_tsc (), немного read () и, очевидно, некоторые накладные расходы на системные вызовы с учетом времени, проведенного в system_call_after_swapgs ().
Теперь это становится поиском ошибок производительности и неэффективности в все уровни вашей инфраструктуры. Неполный список идей:
Относительно TSC на VMware см. КБ 65186
Проблема с производительностью, когда TSC неправильно определены как несинхронизированные (65186)
Симптомы Во время загрузки vmkernel регистрирует сообщение, содержащее фразу «TSC отключен как эталонный таймер: несколько тактовых доменов» или «TSC отключен как эталонный таймер: расходящиеся NUMA TSC».
Впоследствии виртуальные машины показывают необычно низкую производительность при выполнении инструкции rdtsc.
Причина На большинстве современных x86-совместимых машин аппаратное обеспечение гарантирует, что регистры TSC (счетчик отметок времени) всех логических процессоров синхронизируются во время загрузки и всегда остаются синхронизированными друг с другом, если не изменяются программным обеспечением, поэтому TSC можно рассматривать как единый глобальный эталонный таймер. ESXi лучше всего работает на машинах с такими синхронизированными TSC. ESXi также поддерживает машины с несинхронизированными TSC, но со значительным снижением производительности. В частности, выполнение инструкции rdtsc на виртуальной машине может быть примерно в 100 раз медленнее, если на хосте есть несинхронизированные TSC.
На некоторых современных машинах ESXi неправильно определяет TSC хоста как несинхронизированные из-за разницы в интерпретации определенных полей таблицы ACPI, предоставляемых встроенным ПО. В настоящее время этой проблеме подвержено большинство машин серии HPE Superdome.
Решение На данный момент нет решения по этой проблеме.
Примечание об обходном пути: не применяйте этот параметр на машине, на которой действительно нет синхронизированных TSC. Если вы это сделаете, машина в конечном итоге выйдет из строя, когда TSC разойдутся слишком далеко друг от друга, и перед аварией могут возникнуть сбивающие с толку симптомы.
Если хост определенно имеет синхронизированные TSC, вы можете заставить vmkernel использовать TSC в качестве глобального эталонного таймера со следующей опцией загрузки:
esxcli system settings kernel set
--setting=timerForceTSC --value=TRUE
В качестве альтернативы принудительному обходному пути TSC рассмотрите возможность тестирования хоста на альтернативном гипервизоре. Например, KVM, Hyper-V или голый металл. В любом случае, устранение этой проблемы должно быть очевидным, поскольку на функции TSC затрачивается в 100 раз меньше времени.
wl_ssl_conn_recv
находится в стеке 80% времени. Это должна быть функция WebLogic, поскольку я не нахожу ее в исходном коде httpd.
Часть времени, затрачиваемого на это, в конечном итоге связано с poll () и TSC, поэтому сначала проверка синхронизированного TSC может быть более быстрой победой. Тем не менее, загляните в настройка производительности WebLogic.
Также проанализируйте, как выглядят разговоры по протоколу в сети. А именно, как работает https. Попробуйте захват и анализ пакетов, посмотрите, как выглядит время ответа. Оцените скорость соединений: 30 в секунду немного отличается от 300.
Может быть, есть эффективность в реализации HTTP / 2, но я не знаю, как это сделать в WebLogic.
Значительная часть вашего процессорного времени связана с системными вызовами. Оцените, какие исправления и меры защиты вы включили Призрак / Meltdown и MDS. Известно, что они имеют относительно высокую производительность при тяжелых рабочих нагрузках системных вызовов. Протестируйте различные уровни смягчения и сделайте оценку рисков на основе ваших общих мер безопасности.
Может быть, 4 CPU просто недостаточно, по крайней мере, как эта система сейчас настроена. Использование оборудования для решения проблемы с большим количеством экземпляров или большего количества процессоров может быть неэффективным, но, по крайней мере, вы можете поддерживать отзывчивость, настраивая другие вещи.