Bepörög az Apache az imagick-tól

 ( NevemTeve | 2014. február 26., szerda - 19:29 )

Ez most csak egy emlékeztető magamnak, hogy ismét akadt egy kis nyomoznivaló...

Komponensek:

AIX 6.1 (oslevel 6100-09)
Apache httpd-2.4.7
PHP-5.4.24
ImageMagick-6.8.8-4
imagick-3.1.2

Hibajelenség:

A 'phpinfo()' elég a hiba bemutatásához, de csak Apache-on át, standalone-ban jó.
Úgyszintén jó, ha httpd -X paranccsal futtatom.
Akkor is, ha nincs a php.ini-ben az extension=imagick.so.
Amikor nem jó, akkor valamiféle végtelen ciklusban pörög, a truss-ból egyelőre ennyit láttam, hogy némelyik process valamiféle szemaforra vár (_sem_wait), és folyamatosan pörög Err#13 (EACCES) hibával... A többi process logjai alapján olyasmi érzésem van, hogy az egyik process (nyilván a 'főnök') lezárta (sem_destroy) a szemaforokat, amit a gyermekek sem_wait-je EACCES-ként jelez?

20140227.1304 Kissé úgy tűnik nekem, hogy ez a semaphore-dolog mintha inkább thread-ekre lenne ajánlatos, nem pedig processekre... linuxon pl a sem_t típus egy egyszerű számláló, amit a 'wait' csökkent, a 'post' növel... AIX-on elméletileg tud multiprocesszt, de azért némi kétségem van... Ilyesmit produkál a tesztprogramom (az első processz megszünteti a szemaphore-t, mire a második post-olni akarna):

$ ./sema_test IWf2sPD WP
20140227.131516.770 1282086 create: OK sem=00000008
20140227.131516.770 1282086 starting wait...
20140227.131516.770 1282086 wait: OK sem=00000008
20140227.131516.771 1282086 fork: OK child=1077372
20140227.131516.771 1077372 started, program='WP'
20140227.131516.771 1282086 sleep started (3 secs)
20140227.131516.771 1077372 starting wait...
20140227.131519.771 1282086 sleep ended (3 secs)
20140227.131519.771 1282086 post: OK sem=00000008
20140227.131519.771 1077372 wait: OK sem=00000008
20140227.131519.771 1282086 destroy: OK sem=00139026
20140227.131519.771 1282086 exiting
20140227.131519.771 1077372 post: *** errno=22: Invalid argument
20140227.131519.771 1077372 exiting

ez akár egész jó is lehet...

20140227.1440: Elképzelhető-e esetleg, hogy a semaphore-t még root-ként hozza létre az első processz, utána pedig a child-processzek már www-data-ként nem tudnak hozzáférni?
Megalapozatlan becslésem szerint ez a semaphore-mizéria a gomp nevű komponensből jön, tehát az is érdekes, hogy ki hívja őtet.

libMagick++-6.Q16.so
libMagickCore-6.Q16.so
libMagickWand-6.Q16.so
imagick.so

Nahát, nahát, az ImageMagick.... Mi lenne, ha megnéznénk, tud-e gomp nélkül fordulni?

20140227.1513: Szóval azt mondtam az ImageMagick-nak, hogy ./configure --disable-openmp, és most jobb. Esetleg majd később lesz időm kivizsgálni az előbbi gondolatomat, és ha igaznak bizonyul, akkor szólni valakinek (mondjuk a gomp fejlesztőjének), hogy a semaphore-ok remek jó eszközök, csak nem pont erre a célra.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

20140227.1823 Sikerült reprodukálni a hibajelenséget a tesztprogramban, de csak úgy, hogy a pshared mező nulla volt (vagyis nincs megosztás processek között).

$ ./sem_test I0-W-f2-P-w-D W-P
20140227.182213.712 12910594 sem_init(0,1): OK sem=00000017
20140227.182213.712 12910594 sem_wait: starting...
20140227.182213.712 12910594 sem_wait: OK sem=00000017
20140227.182213.712 12910594 fork: OK child=11665634
20140227.182213.712 11665634 started, program='W-P'
20140227.182213.712 12910594 sem_post: OK sem=00000017
20140227.182213.712 11665634 sem_wait: starting...
20140227.182213.712 12910594 Waiting for 1 child
20140227.182213.713 11665634 sem_wait: *** errno=13: Permission denied
20140227.182213.713 11665634 sem_post: *** errno=13: Permission denied
20140227.182213.713 11665634 exiting
20140227.182213.713 12910594 wait: child 11665634 terminated status=0
20140227.182213.713 12910594 sem_destroy: OK sem=ffffffff
20140227.182213.713 12910594 exiting

Tehát valami olyasmi, hogy az imagick jól inicializál valamit gomp-pal, ami a pthread-on alapul, ami a semophore-on alapul; azután elforkol az Apache, és az előkészített micsodák jól érvénytelenné válnak. És mi a pálya linux-on? Gondolom, ehhez a teszt-programot pthread-képesre kellene átalakítanom...

20140228.0557 Megcsináltam a tesztprogramot sysvipc-re is (nem mintha köze lenne a problémához):

$ ./sem_test_sysv I-W-f2-s2-P-w-D W-s1-P
20140228.054900.058 1708122 semget(IPC_PRIVATE,3): OK id=00000001
20140228.054900.058 1708122 initalization: OK
20140228.054900.058 1708122 semop(-1 (wait)): starting...
20140228.054900.058 1708122 semop(-1 (wait)): OK
20140228.054900.059 1708122 fork: OK child=1044630
20140228.054900.059 1044630 started, program='W-s1-P'
20140228.054900.059 1708122 sleep started (2 secs)
20140228.054900.059 1044630 semop(-1 (wait)): starting...
20140228.054902.059 1708122 sleep ended (2 secs)
20140228.054902.059 1708122 semop(+1 (send)): OK
20140228.054902.059 1708122 wait started (for 1 child)
20140228.054902.059 1044630 semop(-1 (wait)): OK
20140228.054902.059 1044630 sleep started (1 secs)
20140228.054903.059 1044630 sleep ended (1 secs)
20140228.054903.059 1044630 semop(+1 (send)): OK
20140228.054903.059 1044630 exiting
20140228.054903.060 1708122 wait: child 1044630 terminated status=0
20140228.054903.060 1708122 semctl(IPC_RMID): OK
20140228.054903.060 1708122 exiting

huh, ebbe en is belefutottam. olyan remlik, mintha ez nem imagemagick bug lenne, hanem openmp, csak IM-mel jon ki a bug.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

(Lehet, hogy végül az imagick-ra kenem az egészet: a globális init-ben csinál valamit, amit a process szintűben kellene csinálnia... vagy ilyesmi)
Neked milyen platformon volt ilyen gondod?

20130228.1024: Vagy én emlékeztem rosszul... Van egy PHP_RINIT_FUNCTION, ami request-enként hívódik (vagyis nagyon gyakran), és egy PHP_MINIT_FUNCTION, ami viszont csak egyetlen egyszer (az első processz hívja meg).

Az is lehet, hogy ez a gond nem létezne, ha multi-thread-ben menne az Apache. Csak én nem vagyok ehhez elég bátor. (Nézetem szerint a multithreading 'pár év múlva' lesz majd stabil, megbízható, kiforrott módszer... nem ahhoz képest, amikor ezt írom, hanem ahhoz képest, amikor ezt olvasod)