За последние 24 часа нас посетили 22929 программистов и 1240 роботов. Сейчас ищут 805 программистов ...

ReactPHP нагрузка на cpu 100%

Тема в разделе "PHP для профи", создана пользователем xaker01, 19 ноя 2018.

  1. xaker01

    xaker01 Активный пользователь

    С нами с:
    16 апр 2016
    Сообщения:
    210
    Симпатии:
    34
    Добрый день столкнулся с такой интересной проблемой.
    При запуске демона на reactphp (socket_v_1.1) работа идет 20-40 часов хорошо.
    Все отлично работает нагрузка cpu 1%.
    Спустя N времени ( чаше всего 2 суток)
    cpu нагружается до 100%.

    За карказ был взят код с https://sergeyzhuk.me/2017/06/22/reactphp-chat-server/
    Результаты
    strace -cp PID

    Когда все хорошо
    Код (Text):
    1.  
    2. % time     seconds  usecs/call     calls    errors syscall
    3. ------ ----------- ----------- --------- --------- ----------------
    4. 65.51   30.203875         381     79272           select
    5. 15.67    7.223466          12    578526           poll
    6.   3.51    1.618171          13    122870           sendto
    7.   2.65    1.221483          14     89365           write
    8.   2.33    1.074446           3    331647     90181 recvfrom
    9.   2.26    1.042860           9    119946           close
    10.   2.10    0.966238          11     89365           open
    11.   1.38    0.635554          21     30535     30535 connect
    12.   1.33    0.611477          20     30535           socket
    13.   0.72    0.330808           4     89365           getcwd
    14.   0.66    0.305419           2    178730           lseek
    15.   0.62    0.286276           9     30535           clone
    16.   0.44    0.202171           2     89365           fstat
    17.   0.22    0.099490           2     64660           fcntl
    18.   0.21    0.098397           7     13406         5 lstat
    19.   0.15    0.068192           2     30536           getsockopt
    20.   0.12    0.056094           2     30536           getpeername
    21.   0.11    0.048970           2     30536           getsockname
    22.   0.02    0.008363          10       875           accept
    23.   0.00    0.000418          14        30           munmap
    24.   0.00    0.000321           7        45        29 shutdown
    25.   0.00    0.000302           8        36           mmap
    26.   0.00    0.000191           5        36           madvise
    27.   0.00    0.000016          16         1           restart_syscall
    28. ------ ----------- ----------- --------- --------- ----------------
    29. 100.00   46.102998               2030753    120750 total
    Когда полный писец и нагрузка под 100%


    Код (Text):
    1.  
    2. % time     seconds  usecs/call     calls    errors syscall
    3. ------ ----------- ----------- --------- --------- ----------------
    4. 95.58   64.301322          99    652609           select
    5.   2.39    1.606987           2    652610    652610 accept
    6.   2.03    1.363961           2    652610           poll
    7. ------ ----------- ----------- --------- --------- ----------------
    8. 100.00   67.272270               1957829    652610 total
    Вот теперь гадаю, это проблемы из за reactphp
    или это из за ОС(centos 7)

    с какой стороны ошибки.
    Может кто сталкивался с проблемой.

    Надо бы сделать профилирование наверное еще. Но вот не совсем знаю как это сделать на xdebug именно в демоне.
    так как php 7 то XHprof тут отпадает.
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.155
    Симпатии:
    1.769
    Адрес:
    :сердА
    Когда все идет хорошо, не жрет не жрет не жрет, а потом ВНЕЗАПНО начинает жрать как не в себя, частенько виноват сборщик мусора, запуск которого откладывался до последнего, а потом система решила, что настало его время. Когда он начинает чистить весь шлак, набежавший за 20-40 часов часов хорошей работы, сервак встает колом. Эта проблема довольно остро и на десктопах чувствуется в разработке, кстати.

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

    Но это лишь одна из возможных причин. Не факт, что верная.
     
    artoodetoo и xaker01 нравится это.
  3. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    экстрасенсы в отпуске, по типам системных вызовов очень сложно угадать что там делает ваш пыхоскрипт :)
     
  4. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    xaker01 нравится это.
  5. xaker01

    xaker01 Активный пользователь

    С нами с:
    16 апр 2016
    Сообщения:
    210
    Симпатии:
    34
    Спасибо за советы, очистка мусора не помогла.
    Все же php просто не сильно подходит под такие задачи.
    Были и другие варианты для решения, это то что сокет не разрывается и буффер ожидает пакет, и многое другое что отследить средствами тяжело.

    Проблема решена переписыванием на node =)
    до конца не хотел этого делать...
     
  6. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    перезагрузку на крон раз в сутки
    парам-парам-пам
     
  7. xaker01

    xaker01 Активный пользователь

    С нами с:
    16 апр 2016
    Сообщения:
    210
    Симпатии:
    34
    это у нас узнаем pid процесса сохраняем его в бд(или в файл)
    потом делаем скрипт который делает kill по процессу, и запускает заново.
    Еще остается вероятность того что порт не сразу освободился.(через reactphp сразу, но через стандарно socket минут 5 надо)

    Коротко это костыль, а не решение для production
     
  8. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    перезагрузку сервера имел ввиду :)
    да, но это простое и быстрое решение, позволяющее не вникать в процессы происходящие в ОС
    --- Добавлено ---
    дело хозяйское. Я так, как вариант предложил
    --- Добавлено ---
    в тележку к нам захаживай)
     
    xaker01 нравится это.
  9. abrdabr

    abrdabr Новичок

    С нами с:
    28 янв 2017
    Сообщения:
    774
    Симпатии:
    65
    вангую дело в пыхе:
    если б мусор был то росла бы оператива иль своп

    вангую ещё раз:
    дело в стороннем модуле

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