Задать вопрос
  • Какая может быть причина отключения ПК?

    Vamp
    @Vamp
    Оперативную память протестируйте мемтестом с загрузочной флешки. А то проверили всё, а самое очевидное пропустили.
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Я только не понял, откуда возьмётся перерасход TCP портов при обычном коннекте. Создавая новое соединение мы закрываем старое. Ку да у вас при этом пропадает исходящий порт?

    Ипатьев, коннект при закрытии не освобождает занятые ресурсы, а просто переводится в состояние TIME_WAIT, в котором он находится какое-то время. В линуксе это 60 секунд. И только по истечению этого времени ОС подчищает коннект и освобождает занятый порт. Это поведение описано в RFC на TCP, поэтому оно одинаковое везде. Итак, первое: после закрытия коннекта порт остаётся занятым ещё минуту.

    При открытии TCP коннекта к удалённому серверу клиент может указать номер локального порта, но в подавляющем большинстве случаев никто этого не делает и ОС выбирает доступный порт из так называемого диапазона эфемерных портов. В моём случае это порты с 32768 по 60999:
    $ sysctl net.ipv4.ip_local_port_range
    net.ipv4.ip_local_port_range = 32768	60999

    Второе: всего доступен 28231 порт для исходящих TCP соединений

    Делим 28231 на 60 и получаем теоретическую производительность в 470 rps в течение минуты и более, при превышении которой начнут появляться ошибки вида "Cannot assign requested address" при коннекте к базе. Разумеется при условии, что каждый запрос триггерит соединение к базе.

    Решений у этой проблемы много разных. Например, можно выставить опцию net.ipv4.tcp_tw_reuse=1 и тогда система начнёт прибивать TIME_WAIT коннекты до истечения таймаута, если свободных портов больше нет. Ещё можно расширить диапазон эфемерных портов. Или перевести коннекты к базе на юникс сокет (хотя здесь уже начинает работать лимит на количесто открытых файловых дескрипторов). Но это всё лечение симптомов. Более правильным вариантом был бы переход на персистентные соединения. Но у меня проект сидел на PDO и я не рискнул, так как PDO не чистит коннект между http запросами как это делает mysqli. В итоге я просто включил tcp_tw_reuse для быстрого решения проблемы на месте, затем задеплоил проект на второй сервер, настроил балансировку запросов между ними, а в конце-концов просто переписал эту часть проекта на java, где есть нормальные пулы коннектов.

    Был у меня и другой случай. Хоть и не про базу, но тоже про экономию TCP коннектов. Есть сервер, находящийся за маршрутизатором cisco. На сервере прописан только серый ip и выход в интернет делается при помощи NAT на циске. На сервере работает приложение, которое рассылает клиентам уведомления на их http колбэки. В какой-то момент уведомлений стало так много, что циска упёрлась в лимит NAT трансляций и новые коннекты в интернет вообще не устанавливались. Решением было включение опции keep-alive в используемой http библиотеке (это было на java). В итоге вместо отдельного TCP соединения на каждый http запрос создалось немножко постоянных TCP соединений на каждого отдельного клиента (домен клиента), в которых гонялись http запросы.

    А используется там практически безальтернативно PDO, которое в mysql_change_user() не умеет. Так что советуйте свои советы пользователям Ларавля и Симфони, а когда они с вами согласятся - то тогда так и быть, попинайте и меня, грешного.

    Да, у PDO с этим действительно проблема и она никак не решается. Единственный реальный вариант там - переоткрыть коннект. Есть ещё вариант тщательно следить за кодом, но я не верю в него, так как пхп, "созданный, чтобы умирать", не воспитывает в программистах аккуратность и внимание к деталям. В частности, из-за этого у нас есть битрикс, вордпресс и прочие ругательные слова, а сам язык имеет репутацию языка для быдлокодеров.

    К счастью у ТС mysqli, с которым можно красиво порешать.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    "Экономию исходящих TCP портов" вы себе выдумали на пустом месте, при использовании обычного коннекта будет такая же "экономия".

    Ипатьев, TCP коннекты - тяжёлый и ограниченный ресурс. Осознание этого факта обычно приходит с опытом работы в хайлоаде. Нет ничего зазорного в том, что вы не верите. Я бы тоже не поверил, если б не столкнулся лично.

    В документации на эту функцию нигде не написано, что она служит для проверки соединения или замены mysqli_ping.

    А она и не предназначена для замены mysqli_ping. Не понимаю с чего вы так решили. Я лишь посоветовал ТСу заменить mysqli_ping на mysqli_change_user в данном конкретном скрипте, потому что это лучший вариант конкретно в этом случае.
    И вот именно для того, чтобы сэкономить все эти операции, mysqli_change_user не следует дёргать при каждом обороте event loop-a. Это просто глупость.

    Получается, разработчики расширения mysqli тоже совершают глупость, так как они вызывают ровно эту же функцию в реализации персистентных соединений.
    А если коннект действительно упал, то mysqli_change_user не сработает.

    Всё верно. И на такой случай ТС уже ввёл переменную $connOk и она прекрасно сработает в тандеме с mysqli_change_user.
    поэтому надо написать свою замену mysqli_ping
    ...
    и не выдумывать.

    А потом ловить непонятные проблемы, когда скрипт вызывает mysql функцию get_lock, а release_lock не вызывает, потому что где-то между этими вызовами скрипт ловит эксепшен и выдает клиенту ошибку и приступает к обработке нового http запроса, который сразу же впадает в дедлок, пытаясь захватить этот не освобожденный лок. Или транзакция не успевает закоммититься из-за того же эксепшена, а глупый программист не натыкал где надо ролбэков, в итоге следующий http запрос продолжит чужую транзакцию. Я понимаю, что get_lock, транзакции из более чем одного запроса - это уже продвинутые фичи и не каждый с ними знаком. Но всё же они существуют и по мере развития проекта могут больно ударить пользователей roadrunner и других ивент лупов.

    Не, ну можно конечно наплевать на логику, понадеяться на авось и взять в работу "грязный" коннект. Но я бы не советовал.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Ипатьев, не напутал. Так написано в документации на эту функцию. К тому же нативные персистентные коннекты в mysqli очищаются ровно таким же способом перед запуском нового php скрипта (об этом тоже написано в доке).

    С таким же успехом можно и вовсе новое соединение открывать.

    Можно, но тогда каждый раз будет создаваться новое TCP соединение. Вероятно, помимо экономии на установке TCP, экономится ещё и время на создание внутренних структур и проведение какой-то подготовительной работы на стороне сервера для каждого нового коннекта. Ещё бонусом идёт экономия исходящих TCP портов, но ТС вряд ли когда-то столкнётся с проблемой исчерпания портов.
    Написано
  • Как точно работает скрипт на RoadRunner?

    Vamp
    @Vamp
    Михаил, ну так в 8.4 её не удалили и всё ещё можно пользоваться. Однако "можно" != "нужно".
    Написано
  • Что подразумевается под полем http_x_real_ip в log_format Nginx?

    Vamp
    @Vamp
    Salamandrine, формат этих заголовков отличается. В X-Forwarded-For может указываться несколько ip адресов через запятую. Первым будет ip клиента, а следующие - ip промежуточных прокси, через которые проходил запрос:
    X-Forwarded-For: <client>, <proxy1>, <proxy2>
    Более подробно по ссылке.

    В X-Real-IP указывается только ip клиента.
    Написано
  • Пробросил порты. TCP работает, UDP нет. В чём может быть причина?

    Vamp
    @Vamp
    pfg21, это gpon роутер. Сомневаюсь, что у ТС найдётся комп с оптическим интерфейсом для проверки.
    Написано
  • Какие есть варианты grpc service discovery с минимальным откликом?

    Vamp
    @Vamp
    tync, понятно. А в чём вопрос? Конкретизируйте.
    Написано
  • Какие есть варианты grpc service discovery с минимальным откликом?

    Vamp
    @Vamp
    Не очень понятно в чём проблема с Eureca, ZooKeeper, Consul. Вы делаете дисковери запрос 300+ раз в сек? Зачем так часто?
    Написано
  • Как подключить все 4 вентиляторы в пк на один разьём 4 pin?

    Vamp
    @Vamp
    Fessoxx, мда, мануалов на неё в сети не найти.

    Вобщем, в разъём CPU_FAN вставляете только кулер от процессора, без вариантов. Если все остальные SYS_FAN у вас трёхпиновые, то есть три варианта.

    1. Воткнуть провод от контроллера в 3-pin коннектор. 3-pin и 4-pin совместимы друг с другом. Можно 4-пиновый коннектор вставлять в 3-пиновый слот и наоборот, 3-пиновый коннектор в 4-пиновый слот.

    Распиновка у 4-pin такая: первые два - питание, третий - тахометр (кулер по нему подаёт в материнку информацию о своей скорости вращения), последний - PWM (по нему материнка управляет скоростью кулера).

    Скорость материнка может регулировать путём изменения напряжения на пинах питания (это единственный вариант для 3-пиновых соединений), либо отправляя сигнал на пин PWM (позволяет регулировать скорость в более широких пределах, чем регулировкой одного только питания).

    Обратите внимание на кабель от вашего контроллера:
    68c99b2a1f9c1004735209.png
    Проводки к пинам питания отсутствуют, так как у контроллера своё питание через SATA коннектор напрямую от БП. PWM висит в воздухе. Реально подключен только тахометр. Такая схема будет работать, но есть нюанс - материнка лишена любых возможностей регулировать скорость. Зато можно будет посмотреть в биосе или системных тулзах в ОС скорость, так как тахометр всё же подключен. Только смысла в этом мало, ведь скорость всегда будет статичная.

    2. Не вставлять в материнку ничего. Кулеры будут и так работать. Единственное отличие от варианта 1 - в системе не будет видна скорость вращения кулеров.

    3. Переткнуть кабели от кулеров из контроллера в материнку. Если SYS_FAN разъёмов на материнке не хватает, можно воспользоваться разветвителем типа такого:
    68c99d7f4283e811599145.png
    Надо только следить, чтобы на каждый SYS_FAN разъём было подключено кулеров с суммарной силой тока не более 1А (как определить ток кулера я писал в комментарии выше). RGB кабели можно оставить подключенными в контроллер и управлять подсветкой через кнопку reset (если сама кнопка подключена к контроллеру).
    Написано
  • Как учиться и практиковаться?

    Vamp
    @Vamp
    Adamos, негативная мотивация работает крайне редко.
    Написано
  • Почему с Ubuntu server невозможно достучаться до ru.archive.ubuntu.com?

    Vamp
    @Vamp
    shupike, смотрите, у домена ru.archive.ubuntu.com два ip адреса:
    $ host ru.archive.ubuntu.com
    ru.archive.ubuntu.com is an alias for mirror.yandex.ru.
    mirror.yandex.ru has address 213.180.204.183
    mirror.yandex.ru has IPv6 address 2a02:6b8::183

    А теперь посмотрите внимательно на ваш собственный лог:
    Cannot initiate the connection to ru.archive.ubuntu.com:80 (2a02:6b8::183). - connect (101: Network is unreachable)

    Обратите внимание, ваш apt из этих двух ip адресов выбрал адрес 2a02:6b8::183 для скачивания обновлений. Но что-то у вас не так настроено, поэтому выдаётся ошибка "Network is unreachable". Как правило, такая ошибка выдаётся если на сервере вообдще нет ipv6 сети. Поэтому комментаторы и просят вас сначала проверить наличие проблем с ipv6 на вашей собственной стороне.

    Удобно конечно сваливать все проблемы на РКН, но сейчас это явно не тот случай.
    Написано
  • PHP обрезает ссылку после знака #?

    Vamp
    @Vamp
    Дмитрий, раз все получилось, отметьте ответ решением
    Написано
  • PHP обрезает ссылку после знака #?

    Vamp
    @Vamp
    Дмитрий, верно. Надо при публикации ссылку исправлять. В таком виде как у вас сейчас вытащить ссылку можно только через js.
    Написано
  • PHP обрезает ссылку после знака #?

    Vamp
    @Vamp
    Дмитрий, ваш код никак не исправить. У вас сама ссылка некорректная. Как только ссылка станет правильной, то и ваш код заработает.
    Написано
  • PHP обрезает ссылку после знака #?

    Vamp
    @Vamp
    $mega = 'https://mega.nz/file/e8hzUIJS#eE1Nb6VdmFmtF2YlgO8a25X09l_fa9uxtTOjNNBgIS';
    echo 'http://site.ru/dw/?url=' . rawurlencode($mega);
    Написано
  • Как эффективно реализовать балансировку очереди запросов на Java?

    Vamp
    @Vamp
    В fjp не подсунешь свою реализацию очереди, в отличии от ExecutorService. Это сильно ограничивает в реализации политики дедлайнов, когда время выполнения задачи должно укладываться в заранее определённый дедлайн, при достижении которого она эвакуируется из очереди, если ещё не никто не успел взять её.
    Написано
  • Сто́ит ли брать б/у водяное охлаждение?

    Vamp
    @Vamp
    Drno, я купил себе воду с рук за 2/3 от стоимости такой же новой. Вообще никаких проблем ни с тем, что она б/у, ни с тем, что это вода, а не воздух. Журчание воды слышно только при включении компьютера и то, если специально наклоняться к корпусу и прислушиваться. Через пару секунд, когда помпа выйдет на рабочие обороты, журчание прекращается и слышны только вентиляторы радиатора.
    Написано
  • Как подключить все 4 вентиляторы в пк на один разьём 4 pin?

    Vamp
    @Vamp
    bobuk8766, кнопка "отметить решением" сразу под ответом
    Написано