Kasus aneh Mr. Time To First Byte

14

Saya punya server web berdasarkan Linode 1024 VPS berdasarkan

  • Ubuntu 11.10
  • Nginx 1.0.5
  • PHP 5.3.6 (dengan PHP-FPM, APC)
  • Varnish 3.0.2

Dan beberapa blog di sana berdasarkan WordPress 3.3.1. Salah satunya adalah blog biasa, dengan konfigurasi default, tema dan hanya posting "Hello World", untuk menguji server. Yang lain adalah blog yang dikloning dari server lain dengan hampir 10 ribu posting dan lebih dari 10 ribu komentar. Blog ini memiliki sekitar 5 ribu uniques per hari.

Server memberikan angka yang baik pada tes ab untuk blog tes , Tapi tes yang sama dengan blog yang dikloning tidak mungkin dilakukan: tes ab memuat server terlalu banyak, dan saya harus menghentikan prosesnya, yang membuat ab untuk menunjukkan hasil yang sangat buruk ini .

Htop juga menunjukkan beban "normal" ketika dalam operasi normal , tetapi beban besar tidak normal selama uji ab.

Ada hal aneh lain terjadi (yang paling penting bagi saya): Time To First Byte sangat tinggi , tetapi setelah itu menunggu situs memuat sangat cepat. Ini dapat dengan mudah diuji dengan layanan seperti tools.pingdom.com, yang memberikan hasil ini . Mohon perhatikan wilayah kuning itu yang berarti "Waktu tunggu".

Mengapa ini terjadi? Ide yang mungkin:

  • Konfigurasi PHP-FPM salah
  • Linode waktu respons DNS mengerikan. Omong kosong - tes blog menyelesaikan DNS baik, TTFB luar biasa
  • Konfigurasi Nginx salah

Jika seseorang membutuhkan lebih banyak info,

javipa
sumber
Saya pikir ini mungkin ada hubungannya dengan if -farahan Anda menggunakan dalam locationwadah di konfigurasi nginx. Berdasarkan apa yang saya baca di sini wiki.nginx.org/Pitfalls , saya merasa bahwa -fmelakukan pencarian yang tidak efisien untuk file yang dapat menyebabkan masalah Time To First Byte, terutama jika Anda memiliki direktori dengan sejumlah besar file.
d34dh0r53
1
Beberapa pemikiran: a) apa perbedaan dari server asli tempat blog dikloning (misalnya apakah ia menjalankan tumpukan yang sama?) B) jika Anda bisa, jalankan ab langsung dari server menggunakan localhost dan port. Coba akses melalui pernis, dan kemudian akses nginx secara langsung). c) Mengaktifkan log lambat MySQL dan PHP-FPM. d) jalankan mysqltuner.pl dan lihat apakah Anda dapat meningkatkan kinerja MySQL Anda (itu akan menjadi perbedaan yang paling jelas antara blog - atau plugin). e) Konfigurasi PHP-FPM yang Anda posting sepertinya bukan yang digunakan oleh nginx (/var/run/php5-fpm-tpnet.sock! = /var/run/php5-fpm-www-data.sock)
cyberx86
1
Jelas merupakan masalah PHP. Wordpress sangat lambat. Anda akan menginginkan plugin caching untuk mendapatkan waktu muat yang layak ketika Anda memiliki banyak konten.
Martin Fjordvald
2
Anda bilang Anda dapat menjalankan ab di localhost dan mendapatkan 4k req / s '- localhost (sebelumnya / saat ini) yang Anda maksud? Jika nilai itu dari server Anda saat ini - yang dengan TTFB tinggi - maka masalah Anda menjadi jauh lebih menarik - karena Anda telah secara efektif menghilangkan PHP, MySQL, dan server web Anda. TTFB termasuk DNS, waktu perjalanan pulang pergi, dan waktu pemrosesan. TTFB yang panjang biasanya karena pemrosesan (mis. PHP / MySQL). Tujuan menjalankan ab secara langsung terhadap nginx adalah untuk menghilangkan komponen lainnya. Juga, Varnish, jika diatur dengan benar, harus memotong backend, memberikan req / s yang sangat tinggi.
cyberx86
1
Tes localhost Anda tampaknya tidak valid - Anda sebenarnya tidak mengambil blog Anda. Perhatikan perbedaan ukuran halaman: 7500bytes saat diakses dari domain, 151 byte dari localhost. Karena Anda mungkin memiliki beberapa virtualhost, Anda perlu meneruskan header host ke ab. ab -n 1000 -c 100 -H 'Host: mysite.com' http://127.0.0.1/Yang mengatakan - perbedaan dalam cache (Varnish) vs hasil tidak di-cache cukup untuk memvalidasi posisi bahwa masalahnya tidak terkait dengan jaringan, dns, dll dan terletak pada pemrosesan, seperti yang diharapkan.
cyberx86

Jawaban:

24

Pertama, ini bukan jawaban, lebih sebagai pendekatan diagnostik.

Ini sama sekali tidak komprehensif - atau bahkan sesuatu yang dekat, itu hanya titik awal.

Saatnya Byte Pertama

Waktu ke byte pertama (TTFB) memiliki sejumlah komponen:

  • Pencarian DNS: Temukan alamat IP domain (kemungkinan peningkatan: lebih banyak / didistribusikan / server DNS responsif)
  • Waktu koneksi: Buka soket ke server, negosiasikan koneksi (nilai khas harus sekitar waktu 'ping' - perjalanan pulang-pergi biasanya diperlukan - keepalive akan membantu untuk permintaan berikutnya)
  • Menunggu: pemrosesan awal diperlukan sebelum byte pertama dapat dikirim (ini adalah tempat perbaikan Anda seharusnya - itu akan paling signifikan untuk konten dinamis.

Ketika Anda melihat output ApacheBench, Anda juga melihat:

  • Memproses: Ini adalah jumlah menunggu + transfer konten lengkap (jika waktu transfer secara signifikan lebih lama dari yang diharapkan untuk mengunduh jumlah data yang diterima, sedang diproses lebih lanjut (setelah byte pertama diterima) sedang terjadi (misalnya halaman tersebut adalah pembilasan konten karena tersedia)

Perbandingan untuk Menghilangkan komponen

Dengan beberapa pengecualian, masalah Anda akan terletak pada pemrosesan backend, yang biasanya disebabkan oleh kode yang terlalu rumit / tidak efisien, atau MySQL yang dikonfigurasi dengan buruk.

Cara yang baik untuk mendekati masalah ini adalah melalui serangkaian perbandingan yang akan menghilangkan berbagai aspek pengaturan Anda. Perbandingan yang baik harus tetap konstan sebanyak mungkin untuk membantu mempersempit masalah. Saat ini, Anda telah memberikan perbandingan berikut:

  1. Situs identik (dikloning) berjalan di server lama dan server baru:
    • Perbedaan: Server
    • Hasil: server lama cepat; server baru lambat
    • Catatan: Yang Anda butuhkan di sini adalah untuk menghitung perbedaan antara server-server ini - baik dalam hal tumpukan yang digunakan (Nginx, dll) dan perangkat keras (apakah server lama lebih cepat karena merupakan mesin yang lebih kuat?)
    • Kesimpulan: kode mungkin dapat berjalan cepat pada pengaturan yang benar
  2. Situs uji vs situs lengkap di server baru
    • Perbedaan: konten, tema, plugin, dll
    • Hasil: situs uji cepat, situs lengkap lambat
    • Catatan: secara teori, tes ini akan membantu Anda menghilangkan banyak aspek pengaturan Anda - DNS, jaringan, bahkan pengaturan nginx / php / mysql Anda - namun, itu tidak cukup 'adil'.
    • Kesimpulan: konten tambahan memiliki dampak signifikan terhadap kinerja

Tes yang ideal akan membuat Anda menduplikasi situs lengkap Anda, tetapi kemudian menghapus semua konten kecuali satu artikel dan komentar terkait. Tujuan dari tes ini adalah untuk menentukan secara meyakinkan apakah jumlah besar konten yang menjadi masalah atau apakah aspek lain dari pengaturan Anda (plugin wordpress, tema, dll) adalah penyebabnya. Anda pada dasarnya akan membandingkan kinerja situs yang identik, pada server yang sama (baru) - memuat halaman yang sama (panjang yang sama, dll) - dengan satu-satunya perbedaan adalah total konten situs (misalnya ada kemungkinan besar beberapa plugin tidak skala dengan baik dengan peningkatan konten).

Tanpa mengubah apa pun, ada beberapa perbandingan lain yang dapat Anda lakukan:

  • Tes dari lokasi yang jauh vs lokal - ini akan membantu mengidentifikasi apakah jaringan, latensi, dns, dll adalah penyebabnya
    • Anda telah (agak) melakukan ini dan sebagian besar menyimpulkan bahwa Anda tidak memiliki masalah jaringan.
  • Tes melalui Varnish (yaitu port 80) vs nginx secara langsung (port 8080) - cobalah untuk tidak mengubah konfigurasi antar tes - cukup gunakan port yang benar. Ini akan menunjukkan kepada Anda dampak Varnish. Karena Varnish adalah lapisan caching, ia harus melayani semua permintaan setelah yang pertama dengan sangat cepat - pada dasarnya, ia harus mem-bypass backend dan pemrosesan yang diperlukan untuk menghasilkan halaman yang dinamis, dan melayani salinan yang di-cache dengan sangat cepat.
    • Anda telah melakukan ini (walaupun, tidak secara lokal) dan menunjukkan bahwa Varnish memiliki dampak positif yang signifikan terhadap kinerja Anda.

Tuning Backend Anda

Pada titik ini Anda seharusnya sudah menemukan masalah atau menyimpulkan bahwa masalahnya ada di backend Anda. Itu membuat Anda Nginx, PHP, atau MySQL.

(Saya harus menyebutkan di sini, yang selalu berguna untuk mengetahui apakah hambatan Anda adalah CPU, RAM, atau I / O - antara sar, top, iostat, vmstat, free., Dll Anda harus dapat datang ke beberapa kesimpulan tentang ini)

Nginx

Nginx hanya menerima permintaan dan menyajikan konten statis atau memindahkan permintaan ke PHP-FPM - biasanya tidak banyak yang dioptimalkan dengan Nginx.

  • Atur pekerja = # inti CPU
  • Aktifkan keepalive (nilai 10-15 baik)
  • Nonaktifkan pencatatan yang tidak dibutuhkan
  • Tambah ukuran buffer jika diperlukan
  • Hindari pernyataan if (gunakan nama statis alih-alih regex jika memungkinkan, hilangkan ekstensi yang tidak dibutuhkan)

Idealnya, blog percobaan dan blog hasil kloning Anda memiliki konfigurasi yang identik, dalam hal ini, Anda telah secara efektif menghilangkan Nginx sebagai masalahnya.

Aplikasi

Dalam kasus di mana Anda mencoba mengidentifikasi masalah dalam kode Anda (misalnya plugin lambat, dll) log lambat adalah tempat untuk memulai.

  • Aktifkan log lambat MySQL dan log lambat PHP-FPM jalankan patokan Anda dan lihat apa yang muncul sebagai lambat.

MySQL

  • Tingkatkan cache Anda dan jalankan mysqltuner.pl untuk mendapatkan titik awal yang baik.

PHP

  • nonaktifkan ekstensi yang tidak dibutuhkan,
  • nonaktifkan register_globals, magic_quotes_ *, expose_php, register_argc_argv, always_populate_raw_post_data
  • tingkatkan memory_limit
  • open_basedir dan safe_mode memiliki implikasi kinerja yang signifikan, tetapi juga dapat memberikan lapisan pertahanan tambahan. Uji dengan dan tanpa mereka, untuk menentukan apakah dampaknya terhadap kinerja dapat ditoleransi.

PHP-FPM

  • Sesuaikan nilai pm *. - tingkatkan untuk menangani beban tinggi

Perlu dicatat bahwa hasil htop Anda menunjukkan php-fpm mengkonsumsi sebagian besar CPU - dan masalah Anda tampaknya terkait langsung dengan ini.

Caching

Setelah Anda mengoptimalkan setiap kemacetan yang mungkin terjadi, mulailah melakukan caching.

  • Anda sudah memiliki cache opCode (APC) - pastikan itu berfungsi (dilengkapi dengan file uji) - periksa tingkat hit cache Anda, dan jika mungkin miliki cache APC ke memori, bukan ke disk.
  • Atur kode Anda ke cache (mis. Menggunakan plugin untuk Wordpress seperti W3TC)
  • Dengan nginx Anda dapat mengatur caching FastCGI - tetapi karena Anda memiliki Varnish, ini sebaiknya dihindari.
  • Setup layer caching, seperti Varnish (yang sudah Anda lakukan) - dan pastikan itu berfungsi (mis. Gunakan varnishstat, baca Mencapai Hitrate tinggi )
  • Tambahkan lebih banyak caching untuk komponen situs Anda - mis. MemCached jika ada

Terkadang, mengingat keterbatasan aplikasi dan perangkat keras Anda, Anda mungkin tidak dapat meningkatkan kinerja backend sebanyak itu - namun, itulah titik caching - untuk meminimalkan penggunaan backend.

Bacaan lebih lanjut

cyberx86
sumber
2
Itu ringkasan poin yang fantastis untuk dianalisis. Terima kasih banyak atas komentarnya, saya akan mencoba melakukan tes berat dengan semua saran ini - beberapa di antaranya, seperti yang telah Anda katakan, sudah jelas - dan lihat apakah saya akhirnya dapat mendeteksi masalahnya. Salam, cyberx86.
javipas
Tentang memory_limit, itu ditunjukkan di pos lain bahwa itu tidak membantu kinerja.
forloop