Solusi 1:
Selamat atas memiliki situs web yang populer dan mengatur agar tetap berjalan di mesin virtual selama ini.
Jika Anda benar-benar menarik dua juta tampilan halaman per hari, maka Anda akan menumpuk BANYAK sesi PHP di sistem file, dan akan membutuhkan waktu lama untuk menghapusnya tidak peduli apakah Anda menggunakan fuser
atau rm
atau penyedot debu.
Pada titik ini saya sarankan Anda mencari cara alternatif untuk menyimpan sesi Anda:
- Satu opsi adalah menyimpan sesi di
memcached
. Ini secepat kilat, tetapi jika server mogok atau dimulai ulang, semua sesi Anda hilang dan semua orang keluar. - Anda juga dapat menyimpan sesi dalam database. Ini akan menjadi sedikit lebih lambat daripada memcache, tetapi database akan tetap ada, dan Anda dapat menghapus sesi lama dengan kueri SQL sederhana. Namun, untuk mengimplementasikannya, Anda harus menulis pengendali sesi khusus.
Solusi 2:
Menghapus fuser
harus membantu. Pekerjaan ini menjalankan fuser
perintah (periksa apakah file sedang dibuka) untuk setiap file sesi yang ditemukan, yang dapat dengan mudah memakan waktu beberapa menit pada sistem yang sibuk dengan sesi 14k. Ini adalah bug Debian (Ubuntu didasarkan pada Debian).
Alih-alih memcache, Anda juga dapat mencoba menggunakan tmpfs (sistem file dalam memori) untuk file sesi. Seperti memcache, ini akan membatalkan sesi saat reboot (ini dapat diselesaikan dengan mencadangkan direktori ini di suatu tempat di skrip shutdown dan memulihkan di skrip startup), tetapi akan lebih mudah untuk diatur. Tapi itu tidak akan membantu dengan fuser
masalah.
Solusi 3:
Jadi, opsi penyimpanan sesi Memcached dan basis data yang disarankan oleh pengguna di sini adalah pilihan yang baik untuk meningkatkan kinerja, masing-masing dengan kelebihan dan kekurangannya sendiri.
Tetapi dengan pengujian kinerja, saya menemukan bahwa biaya kinerja yang sangat besar dari pemeliharaan sesi ini hampir seluruhnya disebabkan oleh panggilan ke fuser
dalam tugas cron. Berikut grafik kinerja setelah kembali ke tugas cron Natty / Oneiric yang menggunakan rm
bukannya fuser
untuk memangkas sesi lama, peralihan terjadi pada pukul 2:30.
Anda dapat melihat bahwa penurunan kinerja berkala yang disebabkan oleh pembersihan sesi PHP Ubuntu hampir seluruhnya dihapus. Lonjakan yang ditampilkan dalam grafik Operasi Disk sekarang jauh lebih kecil, dan hampir sekecil yang dapat diukur oleh grafik ini, menunjukkan gangguan kecil dan singkat di mana sebelumnya kinerja server menurun secara signifikan selama 25 menit. Penggunaan CPU ekstra sepenuhnya dihilangkan, ini sekarang menjadi pekerjaan yang terikat IO.
(tugas IO yang tidak terkait berjalan pada pukul 05:00 dan tugas CPU berjalan pada pukul 7:40 yang keduanya menyebabkan lonjakannya sendiri pada grafik ini)
Pekerjaan cron yang dimodifikasi yang saya jalankan sekarang adalah:
09 * * * * root [ -x /usr/lib/php5/maxlifetime ] && \
[ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 \
-maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) -print0 \
| xargs -n 200 -r -0 rm