Несколько дней заняло решение проблемы. Из-за массы дел не успел написать сюда.
По итогу:
PHP-код исправен и с ним все ок. Кроме неблокирующего режима. То есть код по-прежнему обрабатывает по 1 запросу. Этот вопрос решу позже.
По деградации - оказалось, что настроек ulimit недостаточно. Ведь запросы проходят через порт. Порт является бутылочным горлышком. Для этого надо обратиться в sysctl.conf и настроить сервер как высоконагруженный (настроек в Интернете полно, гуглится быстро). При этом для MacOs подобных настроек оказалось не нужно. ОС справилась сама.
Сейчас бенчмарк показывает в диапазоне 7.5-10k RPS
Решение:
1. Убедиться, что PHP-код исправен
2. Настроить ulimit -u, ulimit -n
3. Настроить sysctl для highload
4. Reboot
rPman, Кажется понял проблему, но как решить не знаю. У меня запуск сервера стоял автозапуском в файле /etc/init.d/myServer, который состоит из
#!/bin/bash
php -f "/path/to/Server.php" &
И как только выполнил:
service myServer restart
То результаты вернулись в начало (то есть в самую лучшую свою точку) и вновь по нисходящей (деградация).
Таким образом: при передаче сообщений через порт, запуская скрипт Сервера через "автозапуск", словно заполняется какой-то буфер и не сбрасывается. А каждая следующая передача через порт будто обрабатывает весь этот буфер. Может передаваемые данные где-то в ОС сохраняется.... Тут мои знания заканчиваются.
rPman, запустил top на Дебиане и оказалось, что во время теста нагрузка на CPU 98%. Память практически не затрагивается.
Более того, между запусками бенчмарка рестартил PHP. Думал, мало ли PHP сжирает ресурсы и не подчищает за собой. Но не помогает. То есть деградация после каждого запуска продолжается. Помогает только reboot
Заменил на stream, увеличил sysctl -w kern.maxfiles на необходимое число и вроде по первым тестам все заработало.
usleep полностью убрал, но иногда задержки случаются. Например, останавливается на 16к (столько стояло по умолчанию до изменения), немного думает и продолжает. Но это уже лучше, чем раньше.
Это и есть решение проблемы, если кто столкнется с таким. Благодарность Vitsliputsli
Сергей Горностаев, на основании одного домена ничего не произойдет. ICANN сам пишет, что не отвечает кому и на каком основании принадлежат домены. Это нужно чтобы произошло что-то массовое.
none7, Да в целом, как адрес может быть основанием забрать домен. В ФИО - я, платил за него тоже я. Простая логическая цепочка говорит о том, что собственник я. Почему когда вы приходите в какой-нибудь Мегафон со старой пропиской по какому-нибудь вопросу со своей симкой, то вам не отказывают же в обслуживании на этом основании. Глупость какая-то.
Ситуации многими забываются, да и приходят новые люди в IT, которые не знают, что бывают компании-гопники в 2020 году, когда клиентоориентированность стала одним из главных пунктов успеха.
Роман, благодарю за развернутый ответ. Уверен, это внесет ясность для тех, кто, как и я, будет искать ответ на этот вопрос. Насколько я понял, что такой способ хранения данных используется для не часто запрашиваемых файлов, ведь даже собрать все отрезки в рамках одного дата-центра далеко не секундное дело. Например, если разбивать файл по 64mb, вес которого 1Gb, займет десятки секунд.
Как вариант можно часто запрашиваемые файлы сохранять в кэш) и отдавать сразу, но если сервис слишком большой, то кэш становится ресурсопожирающим.
Роман, вы знаете как соблюдается приемлемая скорость выдачи файла при сборке файла? Очень интересно
По итогу:
PHP-код исправен и с ним все ок. Кроме неблокирующего режима. То есть код по-прежнему обрабатывает по 1 запросу. Этот вопрос решу позже.
По деградации - оказалось, что настроек ulimit недостаточно. Ведь запросы проходят через порт. Порт является бутылочным горлышком. Для этого надо обратиться в sysctl.conf и настроить сервер как высоконагруженный (настроек в Интернете полно, гуглится быстро). При этом для MacOs подобных настроек оказалось не нужно. ОС справилась сама.
Сейчас бенчмарк показывает в диапазоне 7.5-10k RPS
Решение:
1. Убедиться, что PHP-код исправен
2. Настроить ulimit -u, ulimit -n
3. Настроить sysctl для highload
4. Reboot