nginx + php-fpm schnell ausgelastet

TAiS46

Registered User
Hallo,

aktuelle Situation
nginx status
Code:
Active connections: 7144 
server accepts handled requests
 3780437 3780437 3766314 
Reading: 36 Writing: 7108 Waiting: 0
top
Code:
top - 01:00:06 up 2 days,  2:33,  1 user,  load average: 16.26, 16.21, 15.89
Tasks: 655 total,   1 running, 654 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.8%us,  2.2%sy,  0.0%ni,  2.9%id, 90.0%wa,  0.0%hi,  4.2%si,  0.0%st
Mem:   8198168k total,  8131576k used,    66592k free,     1784k buffers
Swap:  4000060k total,      380k used,  3999680k free,  6665416k cached
iostat
Code:
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           1.65    0.00    5.44   40.80    0.00   52.11

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sdb               4.80       205.18       325.86   37344648   59311466
sdb1              0.00         0.06         0.00      10502         90
sdb2              0.05         0.00        43.96        112    8001056
sdb3              0.00         0.02         0.02       3578       3288
sdb4              4.75       205.10       281.89   37330152   51307032
sda               4.81       246.90       281.91   44938102   51311338
sda1              0.00         0.06         0.00      10940         90
sda2              0.08        43.96         0.01    8002016        928
sda3              0.00         0.02         0.02       3112       3288
sda4              4.73       202.85       281.89   36921730   51307032
sdc             110.69     18431.80         0.00 3354819595        864
sdc1            110.69     18431.80         0.00 3354818619        864
sdd             262.71     37211.68      2181.38 6772993555  397039488
sdd1            262.71     37211.67      2181.38 6772992579  397039488
sde               9.49      2142.71         0.00  389999683          0
sde1              9.49      2142.70         0.00  389998707          0
sdf              13.78      2278.85       323.82  414779251   58940032
sdf1             13.78      2278.84       323.82  414778275   58940032
md0               0.01         0.10         0.00      17986         26
md1               0.00         0.01         0.00       1448        760
md2               0.01         0.03         0.02       5970       3112
md3              40.07       407.94       277.43   74250994   50494904
sdg              56.73      7044.88      2462.91 1282256313  448280702
sdg1             56.73      7044.87      2462.91 1282254389  448280568
php5-fpm
Code:
pm = dynamic
pm.max_children = 10000
pm.start_servers = 50
pm.min_spare_servers = 50
pm.max_spare_servers = 1000
nginx
Code:
worker_processes  16;
worker_connections  2024;

Download-Speed einer Datei beträgt um die 50kbs obwohl der Server eine Anbindung von 1Gbit's hat. Aktuelle Auslastung rund 400Mbit's.

Warum zeigt top fast 100% iowait an und iostat was anderes?
Passt die fpm config so?

Wäre nett wenn mir einer helfen könnte.

Lg Simon

Edit:
Dazu kommt nach dem fpm restart immer folgende Meldung
Code:
Sep 29 01:51:08.522756 [WARNING] [pool www] seems busy (you may need to increase start_servers, or min/max_spare_servers), spawning 32 children, there are 0 idle, and 131 total children
 
Last edited by a moderator:

Ben.

Registered User
Ob die config passt hängt von der Hardware deines Servers ab.

Was ist das für dein Gerät?
 

d4f

Müder Benutzer
Soweit ich aus tapatalk raus interpretieren kann ist deine festplatte schlichtwegs mit dem repositioning ueberlastet. Wenn ea nur wenige (hundert) MB Daten sind solltest du sie testweise in ein tmpfs packen.
Ausserdem hat dein server keine reseven was worker angeht,erhoeh wie bereits in der meldung angegben das limit
 

TAiS46

Registered User
Nun ja, ich habe noch mehr Festplatten zugeschaltet und habe versucht von denen etwas über php zu laden. Auch dies war leider sehr langsam, obwohl die Festplatte nicht belastet war.

Maschine:
1x Quad Core Xeon L5410
8GB DDR2
24x1,5TB SATA2

tabatalk bin ich nicht registriert wenn du das Forum meinst.

Lg Simon
 

d4f

Müder Benutzer
Nein ich meine meinen browset...
Smartphone-bildschirm halt xd

Was sagt iostats bei den neuen festplatten? Wenn der chipset am limit ist kann eine neue festplatte nichts retten. Als was sind die platten zusammengehaengt? Jbod oder raid? Und wenn raid, soft oder hardware und welcher typ.

Written on my Galaxy S. Please excuse typos!
 

TAiS46

Registered User
iostats kann ich bei zeiten nochmal posten, komme gerade nicht ran.

Es handelt sich um einen 3ware Controller wo jeweils 4 platten in einem raid 10 zusammen hängen.
 

Ben.

Registered User
Der Quadcore hat 8 Kerne, wobei 4 simuliert sind, oder?

Dann würde ich die nginx worker auf 8 reduzieren. Es heisst ein Worker je Core.
 

TAiS46

Registered User
Gut, nginx worker ist nun auf 8, aber das sollte das Problem nicht lösen oder?
Gibt es noch was zu der Einstellung von fpm zu sagen?
 

d4f

Müder Benutzer
Der Quadcore hat 8 Kerne, wobei 4 simuliert sind, oder?
Nein die haben 8 Threads (also Warteschlangen zur simultanen Abarbeitung)
Jeder Core bearbeitet 2 Threads was die Auslastung des Cores erhoehen soll. Nix simuliert ;)

Hast du schon mal versucht direkt ueber ein PHP-Skript lokal auf der Kommando-Konsole eine Datei ausgeben zu lassen respektiv wie hoch ist die Downloadgeschwindigkeit ueber SCP oder FTP?
Wie reagiert das System insgesamt (und was sagt top) wenn es so langsam geht?
 

Ben.

Registered User
Nein die haben 8 Threads (also Warteschlangen zur simultanen Abarbeitung)
Jeder Core bearbeitet 2 Threads was die Auslastung des Cores erhoehen soll. Nix simuliert ;)
Das sind Begrifflichkeiten. Schau mal in dein dmesg ;)
 

blafasel2

New Member
@TAiS46:

Also verstehe ich dich richtig, dass du relativ große Dateien vom Dateisystem über PHP vom nginx ausliefern lässt?

Code:
pm = dynamic
pm.max_children = 10000
pm.start_servers = 50
pm.min_spare_servers = 50
pm.max_spare_servers = 1000
du hast 8GB-RAM ein PHP-FPM Prozess frisst bei mir mit APC und PHP5.3 etwa 100MB Arbeitsspeicher, bei dir ist es vermutlich weniger, aber 10000 maximale Prozesse? Selbst bei 50MB sind das 10000*50=> 500000 / 1024 = 500GB RAM die PHP-FPM allokieren kann.

Rechne dir doch mal ausgehend vom verfügbaren RAM eine Zahl von Workern aus (+ ein wenig Puffer) und probiere es mal mit dem Statischen Prozessmanagement.

Und anscheinend wartet er die meiste Zeit auf die Festplatte, wie sender der PHP-Code denn das File? Eventuell gibt es da ein Problem? Irgendwo muss der große Wert für iowait herkommen.

<spekulation>
Eventuell lockt PHP die Datei wenn sie geöffnet wird und deswegen (bei 7000+ Verbindungen sehr warscheinlich) gibt es das hohe iowait, weil anderer Code/Nutzer dann warten müssen...

Es gibt noch eine Möglich direkt aus PHP Dateien über Nginx zu senden:
http://wiki.nginx.org/NginxXSendfile

damit umgehst du quasi PHP ohne Authentifizierung und ähnliches zu verlieren. Eventuell könnte dir das helfen.
</spekulation>

Ansonsten: Schau dir mal strace an (http://blog.ksplice.com/2010/08/strace-the-sysadmins-microscope/) damit müsstest du den Grund für das hohe Iowait evtl. finden können...

Ich vermute aber das nginx alleine oder PHP-FPM da eher eine untergeordnete Rolle spielen könnten.
 

TAiS46

Registered User
XSendfile von nginx benutze ich. Das sollte nicht das Problem sein.

php5-fpm als static geht gar nicht, das zwingt den server innerhalb sekunden in die knie.

strace werde ich mir mal anschauen, aber ich denke viel bringen wird es leider auch nicht.
 

blafasel2

New Member
Hallo Tais46

hmm da hilft wohl nur rausfinden woher das iowait kommt, raid10 könnte ein grund sein, wenn ständig gelesen wird und ständig geschrieben wird, aber da fehlt mir das wissen. Dateisystem könnte auch Rolle spielen...

Da hilft wohl nur loggen (munin, sar, etc.pp) und schauen ob du aus dem Daten irgendwas schlussfolgern kannst... mit munin kannst du auch ganz gut die Auswirkung einer Konfigurationsänderung beobachten...

Eventuell ist auch an der Hardware was faul.

Wenn du das System mal ohne Last testen kannst mit fio (http://www.linux.com/archive/feature/1310639) oder so... kommst du der Sache eventuell näher...
 

TAiS46

Registered User
Das mit den tcp einstellungen hat vielleicht ein bisschen was gebracht.
Aber leider auch nur anfangs.

fio lasse ich mal durchlaufen.

nginx:
Code:
Active connections: 3165 
server accepts handled requests
 1611890 1611890 1606527 
Reading: 108 Writing: 3057 Waiting: 0
Es scheint aber tatsächlich an der Auslastung der platten zu liegen.

fio bei einem nicht benutzten raid 10
Code:
random-read: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=sync, iodepth=1
Starting 1 process
random-read: Laying out IO file(s) (1 file(s) / 128MB)
Jobs: 1 (f=1): [r] [96.9% done] [4575K/0K /s] [1117/0 iops] [eta 00m:01s]
random-read: (groupid=0, jobs=1): err= 0: pid=13232
  read : io=131072KB, bw=4222KB/s, iops=1055, runt= 31042msec
    clat (usec): min=71, max=246465, avg=945.23, stdev=3352.42
    bw (KB/s) : min= 1563, max= 7480, per=99.42%, avg=4197.49, stdev=1129.11
  cpu          : usr=0.14%, sys=2.20%, ctx=32853, majf=0, minf=24
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued r/w: total=32768/0, short=0/0
     lat (usec): 100=66.46%, 250=6.32%, 500=13.71%, 750=2.93%, 1000=0.49%
     lat (msec): 2=1.52%, 4=1.30%, 10=4.40%, 20=2.48%, 50=0.38%
     lat (msec): 250=0.01%

Run status group 0 (all jobs):
   READ: io=131072KB, aggrb=4222KB/s, minb=4323KB/s, maxb=4323KB/s, mint=31042msec, maxt=31042msec

Disk stats (read/write):
  sdf: ios=32460/0, merge=314/0, ticks=30088/0, in_queue=30088, util=95.90%
fio bei einem aktiven raid 10 (abgebrochen)
Code:
random-read: (g=0): rw=randread, bs=4K-4K/4K-4K, ioengine=sync, iodepth=1
Starting 1 process
random-read: Laying out IO file(s) (1 file(s) / 128MB)
^Cbs: 1 (f=1): [r] [2.3% done] [61K/0K /s] [15/0 iops] [eta 01h:36m:39s]
fio: terminating on signal 2

random-read: (groupid=0, jobs=1): err= 0: pid=11416
  read : io=3088KB, bw=22787B/s, iops=5, runt=138766msec
    clat (usec): min=368, max=4498K, avg=179729.29, stdev=233283.00
    bw (KB/s) : min=    0, max=  232, per=104.68%, avg=23.03, stdev=19.91
  cpu          : usr=0.00%, sys=0.04%, ctx=791, majf=1, minf=39
  IO depths    : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     issued r/w: total=772/0, short=0/0
     lat (usec): 500=0.26%, 750=0.26%
     lat (msec): 2=0.26%, 4=1.30%, 10=8.16%, 20=8.29%, 50=15.41%
     lat (msec): 100=13.08%, 250=23.96%, 500=23.06%, 750=5.05%, 1000=0.65%
     lat (msec): 2000=0.13%, >=2000=0.13%

Run status group 0 (all jobs):
   READ: io=3088KB, aggrb=22KB/s, minb=22KB/s, maxb=22KB/s, mint=138766msec, maxt=138766msec

Disk stats (read/write):
  sdc: ios=24753/1942, merge=555580/8, ticks=5032280/17140656, in_queue=24078180, util=100.00%
Das ist doch mist, ich bezahle nen haufen Geld für einen 1Gbits Server und bekomme nicht mal die 1Gbits mit den Platten raus.
Gibt es sonst noch irgendwelche möglichkeiten den Server bis 1Gbits zu bekommen?
 

Attachments

Last edited by a moderator:

blafasel2

New Member
Hallo Tias46,

Puh, also ich hab mit derartigen Traffic/In dem Szenario keine Erfahrung. Frag doch eventuell mal in Foren wo Leute täglich so eine hohe Last haben. Nginx foren, serverfault, die php-fpm Foren, Provider-Forum... sieht wohl so aus als ob es schon irgendwie gehen würde, wenn man genau weiß wo das Problem liegt...

FreeBSD mit ZFS-RAID wäre eventuell noch eine Alternative, aber wie gesagt, da kommst du wohl um genaue Rumsuchen nicht herum. Die hohe CPU-Last in den Munin Graphen erscheint mir auch seltsam.

Edit: Zur Klarheit - Wenn du 4 Platten hast, und diese mit RAID10 also 0+1 zusammenhängen könnte das eventuell ein Grund für die Langsamkeit sein, RAID-Z (schau mal hier: http://de.wikipedia.org/wiki/RAID#RAID-Z_im_Dateisystem_ZFS) aber da ich das nie wirklich in der Hand hatte, geschweige denn dir sagen kann wie das wirklich performt.... hilft wohl nur Probieren.

Iowait ist defintiv dein Problem [Edit: Ist es nicht, Iowait sagt ja nur wie lange die cpu auf die Festplatten warten muss.... von daher ist das wohl normal)

eventuell wissen die ja die Russen ;) weiter...
 
Last edited by a moderator:

d4f

Müder Benutzer
ich bezahle nen haufen Geld für einen 1Gbits Server und bekomme nicht mal die 1Gbits mit den Platten raus.
Bei random read vieler kleiner Dateien oder Sektoren solltest du noch was auf den Serverpreis drauflegen und SSD nehmen...
Oder alle Dateien in die RAM speichern ;)
Festplatten schaffen technisch bedingt deine Voraussetzungen nicht... allerhoechstens in einem Diskarray ;)
 

TAiS46

Registered User
Was wäre wenn ich statt Raid10 einfach Raid1 nehme?

Ich habe 24x1,5TB Sata Platten.
Somit hätte ich 12x1,5TB.
Dann mit Round Robin die Dateien auf den Platten verteilen, oder
vor upload prüfen, welche Platte am wenigsten belastet ist.
Dann würde ich doch sicher mehr aus dem Server raus bekommen oder sehe ich das falsch?

Womit teste ich am besten random read auf dem system?
 
Last edited by a moderator:
Top