Saya mengalami banyak masalah dengan inefisiensi node_save (). Tetapi apakah simpul menyelamatkan masalah saya? Pada akhirnya itulah yang saya coba cari tahu.
Saya membuat satu lingkaran dengan 100.000 iterasi. Saya membuat minimum untuk objek node agar valid dan menyimpan dengan benar. Inilah node save code:
$node = new stdClass();
$node->type = "test_page";
node_object_prepare($node);
$node->uid = 1;
$node->title = $node_title;
$node->status = 1;
$node->language = LANGUAGE_NONE;
if($node = node_submit($node)){
node_save($node);
}
Inilah hasilnya:
100.000 node disimpan, masing-masing menggunakan node_save (). Butuh 5196,22 detik untuk selesai. HANYA 19 menghemat satu detik.
Untuk sedikitnya, itu tidak dapat diterima, terutama ketika orang ini mendapatkan sekitar 1.200 permintaan memasukkan per detik , dan orang ini mendapatkan 25.000 sisipan per detik .
Jadi, apa yang terjadi di sini? Dimana kemacetannya? Apakah ini dengan fungsi node_save () dan bagaimana ia dirancang?
Mungkinkah itu perangkat keras saya? Perangkat keras saya adalah server pengembangan, tidak ada seorang pun di atasnya kecuali saya - Intel dual core, 3Ghz, Ubuntu 12,04 dengan 16 gigs of ram.
Sedangkan loop menjalankan penggunaan sumber daya saya adalah: MySQL 27% CPU, 6M RAM; PHP 22% CPU 2M RAM.
Konfigurasi mysql saya dilakukan oleh wizard percona .
Mysql mengatakan bahwa jika penggunaan CPU saya di bawah 70% masalah saya adalah disk terikat . Memang, saya hanya memiliki menjalankan pabrik WD Caviar 7200 RPM, tapi saya harus mendapatkan lebih dari 19 sisipan sebentar dengan itu saya harap!
Belum lama ini saya menulis tentang menghemat 30.000 node dalam sehari . Namun, untuk menjadi jelas, simpul ini tidak ada hubungannya dengan kekuatan eksternal apa pun. Ini murni patokan untuk mempelajari tentang cara meningkatkan kecepatan panggilan ke node_save ().
Secara realistis, saya perlu memasukkan 30.000 item ke dalam basis data setiap menit menggunakan node_save. Jika simpanan simpul bukan opsi, saya ingin tahu apakah saya dapat menulis fungsi api drupal saya sendiri "node_batch_save ()" atau sesuatu yang memanfaatkan kemampuan mysql untuk melakukan penyisipan massal dengan permintaan INSERT . Pikiran tentang bagaimana mendekati ini?
sumber
Jawaban:
Anda tidak akan pernah mendapatkan 30.000 sisipan satu menit menggunakan node_save. Tidak mungkin.
INSERT cepat karena hanya itu yang dilakukannya. Node save tidak memasukkan banyak (tabel utama, tabel revisi, tabel untuk setiap bidang), membersihkan semua cache entitas, dan menembakkan kait. Kait adalah bagian yang sulit. Jika Anda memiliki banyak modul contrib (atau bahkan modul yang bertingkah buruk) yang benar-benar dapat mematikan kinerja, terutama jika pembuatnya tidak menjelaskan kasus penggunaan "Saya menghemat satu ton node sekaligus". Misalnya, saya harus menambahkan ini ke kelas Migrasi saya:
Di sisi lain, jika Anda menulis fungsi simpan kustom yang tidak meminta kait, Anda jelas berisiko mendapatkan data yang tidak konsisten, dalam keadaan yang tidak terduga oleh sistem. Saya tidak akan merekomendasikan melakukan itu. Jalankan xhprof dan lihat apa yang terjadi.
sumber
node_save()
, tetapi menambahkan beberapa kode untuk mengurangi masalah yang diketahui yang dapat disebabkan, seperti Pathauto membangun kembali cache menu setelah setiap node menyimpanPertama-tama, instal XCache / APC (untuk PHP <5.5) dan konfigurasikan memcached untuk Drupal.
Kemudian Anda dapat mengoptimalkan konfigurasi MySQL Anda untuk pertanyaan berat dengan menggunakan skrip mysqltuner yang tersedia di: http://mysqltuner.pl
Misalnya
Saran lain:
sumber
Gunakan modul Mongodb untuk menyimpan bidang https://drupal.org/project/mongodb Hasil di sini: sesuai http://cyrve.com/mongodb
sumber