Suivi des appels système

Lorsque vous souhaitez savoir ce qu'un processus est en train de faire, vous pouvez suivre tous les appels système d'un processus en utilisant la commande strace.

1、Exécutez php start.php status pour voir les informations sur les processus liés à Workerman comme suit :

Hello admin
---------------------------------------STATUT GLOBAL--------------------------------------------
Version de Workerman : 3.0.1
Temps de démarrage : 2014-08-12 17:42:04   en cours depuis 0 jours 1 heure
Charge moyenne : 3.34, 3.59, 3.67
1 utilisateurs          8 travailleurs       14 processus
nom_du_travailleur       statut_sortie     nombre_sortie
BusinessWorker    0                0
ChatWeb           0                0
FileMonitor       0                0
Gateway           0                0
Monitor           0                0
StatisticProvider 0                0
StatisticWeb      0                0
StatisticWorker   0                0
---------------------------------------STATUT DU PROCESSUS-------------------------------------------
pid mémoire      à l'écoute        timestamp  nom_du_travailleur       total_demande paquet_err thunder_herd client_close send_fail throw_exception suc/total
10352   1.5M    tcp://0.0.0.0:55151  1407836524 ChatWeb           12             0          0            2            0         0               100%
10354   1.25M   tcp://0.0.0.0:7272   1407836524 Gateway           3              0          0            0            0         0               100%
10355   1.25M   tcp://0.0.0.0:7272   1407836524 Gateway           0              0          1            0            0         0               100%
10365   1.25M   tcp://0.0.0.0:55757  1407836524 StatisticWeb      0              0          0            0            0         0               100%
10358   1.25M   tcp://0.0.0.0:7272   1407836524 Gateway           3              0          2            0            0         0               100%
10364   1.25M   tcp://0.0.0.0:55858  1407836524 StatisticProvider 0              0          0            0            0         0               100%
10356   1.25M   tcp://0.0.0.0:7272   1407836524 Gateway           3              0          2            0            0         0               100%
10366   1.25M   udp://0.0.0.0:55656  1407836524 StatisticWorker   55             0          0            0            0         0               100%
10349   1.25M   tcp://127.0.0.1:7373 1407836524 BusinessWorker    5              0          0            0            0         0               100%
10350   1.25M   tcp://127.0.0.1:7373 1407836524 BusinessWorker    0              0          0            0            0         0               100%
10351   1.5M    tcp://127.0.0.1:7373 1407836524 BusinessWorker    5              0          0            0            0         0               100%
10348   1.25M   tcp://127.0.0.1:7373 1407836524 BusinessWorker    2              0          0            0            0         0               100%

2、Par exemple, si nous voulons savoir ce que fait le processus gateway avec le pid 10354, nous pouvons exécuter la commande strace -p 10354 (il se peut que des droits root soient nécessaires), similaire à ce qui suit :

sudo strace -p 10354
Processus 10354 attaché - interrupteur pour quitter
clock_gettime(CLOCK_MONOTONIC, {118627, 242986712}) = 0
gettimeofday({1407840609, 102439}, NULL) = 0
epoll_wait(3, 985f4f0, 32, -1)          = -1 EINTR (Appel système interrompu)
--- SIGUSR2 (Signal défini par l'utilisateur 2) @ 0 (0) ---
send(7, "\f", 1, 0)                     = 1
sigreturn()                             = ? (masque maintenant [])
clock_gettime(CLOCK_MONOTONIC, {118627, 699623319}) = 0
gettimeofday({1407840609, 559092}, NULL) = 0
epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 32, -1) = 1
clock_gettime(CLOCK_MONOTONIC, {118627, 699810499}) = 0
gettimeofday({1407840609, 559277}, NULL) = 0
recv(9, "\f", 1024, 0)                  = 1
recv(9, 0xb60b4880, 1024, 0)            = -1 EAGAIN (Ressource temporairement indisponible)
epoll_wait(3, 985f4f0, 32, -1)          = -1 EINTR (Appel système interrompu)
--- SIGUSR2 (Signal défini par l'utilisateur 2) @ 0 (0) ---
send(7, "\f", 1, 0)                     = 1
sigreturn()                             = ? (masque maintenant [])
clock_gettime(CLOCK_MONOTONIC, {118628, 699497204}) = 0
gettimeofday({1407840610, 558937}, NULL) = 0
epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 32, -1) = 1
clock_gettime(CLOCK_MONOTONIC, {118628, 699588603}) = 0
gettimeofday({1407840610, 559023}, NULL) = 0
recv(9, "\f", 1024, 0)                  = 1
recv(9, 0xb60b4880, 1024, 0)            = -1 EAGAIN (Ressource temporairement indisponible)
epoll_wait(3, 985f4f0, 32, -1)          = -1 EINTR (Appel système interrompu)
--- SIGUSR2 (Signal défini par l'utilisateur 2) @ 0 (0) ---
send(7, "\f", 1, 0)                     = 1
sigreturn()                             = ? (masque maintenant [])

3、Chaque ligne représente un appel système, à partir de ces informations, nous pouvons facilement voir ce que fait le processus et localiser l'emplacement où le processus est bloqué, que ce soit lors de la connexion ou de la lecture de données réseau.