NB To jest nie duplikat PHP session_start() causing HTTP requests to hang (i inne podobnie nazwane pytania na SO), ponieważ moje zawieszenie jest sporadyczne, a nie stałe.Dlaczego PHP czasami zawiesza się na session_start()
Korzystanie z Ubuntu 12.04,
Magento
, PHP-FPM (5.4)
i domyślnej sesji sesji PHP (z plikami na ext4).
Nawiasem mówiąc (once per month)
wszystkie procesy PHP powiesić na session_start()
(zgodnie z FPM-slow.log):
[24-Sep-2014 11:03:04] [pool www] pid 24259
script_filename = /data/web/public/index.php
[0x00007f00b4ec6480] session_start() /data/web/public/includes/src/__default.php:7687
[0x00007f00b4ec6130] start() /data/web/public/includes/src/__default.php:7730
[0x00007f00b4ec5fb8] init() /data/web/public/includes/src/__default.php:8086
[0x00007f00b4ec5e30] init() /data/web/public/includes/src/__default.php:33902
[0x00007f00b4ec5bd0] __construct() /data/web/public/includes/src/__default.php:23841
[0x00007f00b4ec5ae8] getModelInstance() /data/web/public/app/Mage.php:463
[0x00007f00b4ec59c8] getModel() /data/web/public/app/Mage.php:477
[0x00007f00b4ec49a0] getSingleton() /data/web/public/includes/src/__default.php:14044
[0x00007f00b4ec4848] preDispatch() /data/web/public/includes/src/Mage_Adminhtml_Controller_Action.php:160
[0x00007f00b4ec3b00] preDispatch() /data/web/public/includes/src/__default.php:13958
[0x00007f00b4ec26e0] dispatch() /data/web/public/includes/src/__default.php:18331
[0x00007f00b4ec20c0] match() /data/web/public/includes/src/__default.php:17865
[0x00007f00b4ec1a98] dispatch() /data/web/public/includes/src/__default.php:20465
[0x00007f00b4ec1908] run() /data/web/public/app/Mage.php:684
[0x00007f00b4ec17f8] run() /data/web/public/index.php:87
lsof mówi:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php5-fpm 24259 app 10uW REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
php5-fpm 24262 app 10u REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
php5-fpm 24351 app 10u REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
php5-fpm 24357 app 10u REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
php5-fpm 24358 app 10u REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
php5-fpm 25563 app 10u REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
php5-fpm 25564 app 10u REG 202,1 82492 1220594 /data/web/public/var/session/sess_gr2clur9icgd7s2j9linag7ue6
Według strace wszystkie te procesy czekają na stadzie (LOCK_EX)
, nawet ten, który ma flagę W w powyższym wyjściu lsof.
Użycie procesora podczas tego incydentu jest blisko 0.
Więc dlaczego pierwszy session_start
hang, choć wydaje się, że nabył blokady zapisu na plik sesji? Jak mogę to debugować?
Oto dyskusja pod tytułem "race condition with ajax and php sessions". W rzeczywistości żądania, które wyzwalają powyższy problem, są niezmiennie wywołaniami AJAX. Jednak ten artykuł stanowi, że:
Jeśli używany wbudowany, domyślny sesji PHP magazynowe (który używa plików), nigdy nie natknąć się na problem.
Obecnie nie mam pojęcia, gdzie szukać dalej.
Zanim zacznę myśleć: cholernie dobre pytanie! edytuj: Po zastanowieniu: Nie mam pojęcia. – MoshMage
Raz w miesiącu? Czy zdarza się regularnie, mniej więcej w tym samym dniu i czasie? –
Zły dysk? To będzie trudne do debugowania. – Brad