Perintah `drush cc all` membutuhkan waktu terlalu lama, apa yang bisa saya lakukan?

12

Di situs saya drush cc allmembutuhkan waktu lebih dari 4 menit untuk menjalankan. Situs db adalah beberapa GB. Namun, saya tidak dapat melihat alasan yang jelas mengapa ini memakan waktu terlalu lama. Apa yang bisa saya lakukan untuk menemukan leher botol?

awm
sumber
Periksa dulu kueri log mysql: drupal.stackexchange.com/questions/75629/…
AgA
Apakah Anda memiliki cron running?
mpdonadio
Ya, saya memiliki cron yang berjalan. Situs ini lambat secara umum. Begitu banyak kode lawas yang tidak layak untuk diperhitungkan kembali.
awm
Saya setuju dengan @MPD di sini, saya tidak berpikir ini terkait dengan memori. MySQL juga hanyalah salah satu alasan yang mungkin. Hanya ada satu cara untuk mengetahuinya dan itu adalah profil itu. Cara termudah untuk melakukannya adalah menggunakan ekstensi xhprof dan devel, yang juga berfungsi dengan drush (gunakan -d untuk melihat tautan ke laporan). Dugaan saya adalah bahwa ada sejumlah masalah, Masalah khas jika situs lambat untuk semua permintaan adalah modul yang hilang, lihat drupal.stackexchange.com/questions/724/why-is-drupal-7-so-slow . Tampilan juga memiliki beberapa masalah kinerja utama dengan cache, lihat drupal.org/node/1944674 .
Berdir
Terima kasih, saya pikir saya harus melakukan profil, tetapi dalam kasus basis kode drupal, selalu sulit untuk menentukan kemacetan. Meskipun saya katakan situs itu lambat, tidak terlalu lambat dan cc drush semua, lebih lambat secara tidak proporsional.
awm

Jawaban:

6

Menghapus cache itu sendiri tidak memakan waktu lama, karena itu hanya memotong tabel cache. Apa yang paling memakan waktu adalah membangun kembali registri cache setelah itu. Biasanya ini adalah registry tema yang memindai semua kait baru dan semua folder Drupal Anda untuk file template baru, sistem yang memindai file untuk modul baru dan file kelas, dan yang serupa.

Anda selalu dapat menghapus cache spesifik dengan menentukan drush cc theme-registryatau lainnya.

Sangat disarankan agar Anda menggunakan mekanisme caching PHP (mis. OPCache, XCache, dll.) Untuk mempercepat pemrosesan. Dan cache berbasis memori untuk menggantikan penggunaan yang berat pada tabel SQL (misalnya memcached atau redis), jadi membersihkan cache tidak akan memakan waktu, hanya dengan membersihkan cache (misalnya echo flush_all > /dev/tcp/127.0.0.1/11211dalam Bash).

Atau Anda selalu dapat menghapus cache secara manual , misalnya dengan:

echo "SHOW TABLES LIKE 'cache%'" | $(drush sql-connect) | tail -n +2 | xargs -L1 -I% echo "DELETE FROM %;" | $(drush sql-connect) -v

Debugging

Untuk memeriksa apa yang paling memakan waktu khusus, Anda perlu men - debug / profil itu (misalnya XDebug, XHProf, phpdbg, dtrace).

Pada OS X / Unix, ini dapat dicapai dengan dtrace(setelah menjalankan drush):

sudo dtrace -qn 'php*:::function-entry { printf("%Y: PHP function-entry:\t%s%s%s() in %s:%d\n", walltimestamp, copyinstr(arg3), copyinstr(arg4), copyinstr(arg0), basename(copyinstr(arg1)), (int)arg2); }'

Di Linux, gunakan strace, mis

strace -e trace=sendto,recvfrom -s1000 -p $(pgrep php)

Untuk mencari beberapa hal tertentu, coba tambahkan misalnya: strace ... 2>&1 | grep -C5 UPDATE.

kenorb
sumber
5

Jika Anda memiliki basis data yang sangat besar, dan sistem Anda berjalan dengan baik ketika Anda tidak melakukan cache yang jelas, kemungkinan Anda tidak memiliki cukup memori untuk sepenuhnya mendukung pengaturan Anda.

Jika situs Anda berjalan pada kotak Linux, jalankan 'top' (dari shell Anda) dan tekan shift-M untuk mengurutkan daftar proses berdasarkan memori yang digunakan. Kemudian, jalankan operasi penghapus cache dari terminal lain. Anda akan melihat mysql dan apache naik ke bagian atas daftar. Anda akan dapat melihat berapa persentase total memori yang digunakan oleh masing-masing proses ini, dan berapa banyak RAM gratis yang digunakan. Jika Anda memiliki ruang virtual dalam jumlah besar, tetapi semua RAM fisik Anda telah habis, operasi ini dapat menyebabkan kehabisan memori VM, yang dapat menurunkan waktu eksekusi hingga sebagian kecil dari biasanya.

Suatu kali, saya menjalankan situs Drupal mid-traffic pada kotak tanpa memori yang cukup untuk mendukung pengaturan. Ketika saya menjalankan cache-clear pada situs lalu lintas rendah yang tidak terkait, cache membangun kembali mendorong sistem melewati batasnya, dan semuanya terkunci. Jadi, perilaku sistem total penting di sini; inilah mengapa alat sederhana seperti 'top' adalah tempat yang praktis untuk memulai.

greg_1_anderson
sumber
Terima kasih, saya pikir penyebab yang mendasari adalah bahwa situs tersebut telah ada untuk sementara waktu, db agak besar dan kode sangat membutuhkan anjak piutang. Misalnya, operasi node_delete membutuhkan waktu sekitar 3 detik. Saya pikir memberi terlalu banyak memori mungkin berlebihan, apakah Anda setuju?
awm
Saya memilikinya di mesin saya dan juga lambat. Saya menggandakan memori, hingga 1GB dan menghitung waktunya `waktu dr cc cc`. Tidak jauh lebih baik hanya mendapat 4s lebih cepat.
awm
1
Ya, jika seluruh situs lambat sepanjang waktu bahkan dengan banyak memori, maka cc bukanlah masalahnya; Anda harus melakukan pembuatan profil yang lebih umum.
greg_1_anderson
Juga, jika situs tersebut benar-benar tua dan perlu disegarkan, pertimbangkan untuk membangun kembali dari awal dengan modul-modul baru, dan gunakan migrasi drupal-ke-drupal ( drupal.org/project/migrate_d2d ) untuk memindahkan konten Anda.
greg_1_anderson
2

Saya akan tidak setuju (agak) dengan @ greg_1_anderson di sini.

Jika sistem tidak mogok sepenuhnya selama cc all, maka saya tidak berpikir Anda memiliki masalah memori umum. Ketika server LAMP kehabisan memori, itu akan menekan swap. Server aktif yang memukul swap akan menyebabkan longsoran kejahatan. Proses httpd akan mulai menumpuk karena perlambatan sistem (swap membuat sistem berjalan sangat lambat), yang akan menyebabkan lebih banyak swap digunakan, dll. Di situs tempat saya melihat ini terjadi, saya akan melihat proses pemuatan mencapai 100, dan satu ton proses httpd aktif.

Jika sistem Anda pada akhirnya kembali, maka saya pikir Anda kurang baik. drush cc allakan menghasilkan banyak akses basis data, jadi saya pikir ini menunjukkan lebih banyak masalah. Saran saya adalah menjalankan mysqltuner di situs. Jika Anda memiliki basis data multi-GB, tebakan saya adalah ukuran Anda innodb_buffer_pool_sizebahkan dari jarak jauh tidak memadai, dan instance MySQL Anda meronta-ronta. Saya juga akan menyelidiki backend cache alternatif untuk mencoba menjaga agar jejak basis data lebih kecil.

mpdonadio
sumber
Terima kasih, drupal hanya digunakan untuk penggunaan editoria yang memiliki lapisan servie yang memiliki pernis di dalamnya. Pengguna sekarang bisa drupal. Saya hanya ingin menyelidiki apa yang terjadi karena saya pikir ada kemacetan. Saya pikir yang terbaik adalah menyalakan log lambat mysql dan memonitor db. Dan kemudian melakukan beberapa profil dengan
xdebug
TAMPILKAN PROCESSLIST LENGKAP akan memberi tahu Anda apa yang terjadi tanpa perlu menggunakan log kueri lambat (dan tanpa server restart). Lihat jawaban lain untuk mytop juga.
Chris Burgess
1

Bisa jadi lingkungan hosting web Anda. Apakah Anda mengacu pada pengaturan lokal, atau sesuatu hosting di shared hosting atau VPS / server?

  • lingkungan hosting - jika Anda menggunakan hosting web bersama, jumlah memori yang dapat digunakan Drupal / drush akan terbatas, lihat: https://drupal.org/node/207036
  • waktu eksekusi maks - perlu ditingkatkan
geekgirlweb
sumber
Drush biasanya tidak dibatasi oleh max_execution_time. Anda dapat melakukannya drush php-eval "print ini_get('max_execution_time');"untuk memeriksa ulang.
mpdonadio
1

Ini bukan solusi lengkap, hanya satu alat lagi untuk membantu mengidentifikasi sumber keterlambatan Anda.

Selain menggunakan topuntuk memantau proses, Anda mungkin menemukan hasil mytopinformatif. (Jawaban lain di atas menganggap MySQL tetapi jika Anda menggunakan DB backend lain, Anda harus menukar mytop dengan alat yang setara.)

mytopcukup jalankan MySQL SHOW FULL PROCESSLISTdalam satu lingkaran, dan menunjukkan kepada Anda pertanyaan mana yang sedang dieksekusi (sehingga membutuhkan banyak waktu). Jika cache bersih membutuhkan waktu lama untuk membersihkan tabel ini atau itu, Anda akan melihat apa yang menahan semuanya di sini. Jika Anda tidak memiliki akses untuk menginstal mytop, lakukan saja versi kasar di shell Anda -

while true; do mysql -e 'SHOW FULL PROCESSLIST' && sleep 5 && clear ; done

Jika penundaan itu tidak berasal dari permintaan MySQL, maka alat ini setidaknya dapat mengkonfirmasi untuk Anda.

Chris Burgess
sumber
1

Saya menemukan posting blog berjudul Mempercepat Cache Kliring pada Drupal 7 sangat membantu dalam mempersempit bagian proses cache yang jelas memperlambat segalanya. Masalah yang ditunjukkan dalam modul fitur dan modul entitas api memengaruhi situs saya, tetapi proses yang dirinci dalam pos juga membantu saya melacak masalah yang kami temui dalam modul inti dan breakup Drupal .

Butuh beberapa waktu untuk menyelesaikan prosesnya, tetapi ini membantu saya mengurangi cache dari beberapa menit menjadi kurang dari satu menit.

Matt V.
sumber