Celery: Mulai ulang masalah seledri dan file konfigurasi pengawas yang lebih baik

Dibuat pada 9 Mei 2010  ·  16Komentar  ·  Sumber: celery/celery

Saya menggunakan file konfigurasi supervisord berdasarkan contoh di repositori seledri dan memiliki beberapa masalah ketika restart seledri terjadi: terkadang pemrosesan tugas berhenti secara diam-diam setelah memulai ulang seledri tanpa ada pesan kesalahan di log. Proses tetap terlihat dalam daftar proses.

Akhirnya saya menemukan bahwa kadang-kadang ketika proses di-restart seledri memunculkan proses tambahan yang tidak dikelola oleh supervisord dan ini mengarah ke bug ini. Jadi saya mulai menonton ps output dengan hati-hati setelah setiap restart dan mematikan proses tambahan secara manual melalui kill. Setelah mematikan proses-proses ini, tugas-tugas mulai dijalankan dengan benar. Ini adalah semacam peretasan yang memecahkan masalah selama seminggu atau lebih.

Dan hari ini saya pikir alasan sebenarnya ditemukan. Nilai supervisord default untuk opsi 'stopwaitsecs' adalah 10 detik. Ini berarti bahwa setelah 10 detik proses seledri akan dimatikan dengan sinyal KILL, bukan TERM. Tampaknya seledri tidak suka dibunuh dan mencoba menelurkan proses tambahan dalam kasus itu.

Jadi saya pikir akan lebih baik untuk menambahkan sesuatu seperti 'stopwaitsecs=600' ke semua file konfigurasi contoh supervisord (dari faq: "Anda tidak boleh menghentikan celeryd dengan sinyal KILL (-9), kecuali jika Anda telah mencoba TERM beberapa kali dan menunggu beberapa menit untuk membiarkannya mendapatkan kesempatan untuk dimatikan.") dan selidiki perilaku seledri pada sinyal KILL: disebutkan dalam dokumen bahwa tugas akan hilang (dan itu dapat ditoleransi dalam banyak kasus) tetapi masalah dengan spawned prosesnya agak aneh.

Komentar yang paling membantu

Jika Anda masih mengalami masalah dalam menghentikan pekerja Seledri Anda, Anda dapat mencoba menyetel stopasgroup=true sebelum meningkatkan stopwaitsecs Anda.

Semua 16 komentar

Proses yang muncul saat menerima sinyal KILL memang aneh. Saya tidak melihat perilaku itu ketika digunakan di luar supervisord , jadi mungkin ini disebabkan olehnya?

Jika Anda menginstal modul setproctitle , seledri harus melaporkan jenis proses dalam ps , dapatkah Anda melakukannya untuk menyelidiki jenis proses apa yang dibuat?

( easy_install setproctitle )

Menyetel batas waktu ke 600 mungkin bagus. Apakah ada pengaturan untuk infinity (mungkin dengan peringatan jika terlalu lama)? Ketika celeryd dimatikan melalui TERM (yang merupakan sinyal shutdown yang disukai), ia berhenti menerima pesan dan menunggu tugas yang sedang dijalankan selesai. Dan saya kira untuk sebagian besar aplikasi, penghentian pertengahan eksekusi tidak dapat diterima.

Adapun proses pemijahan: setproctitle dan mengawasi id proses sangat membantu. Ini bukan proses pemijahan. Proses pekerja tetap hidup ketika proses induk dimatikan.
Ini adalah simulasi restart supervisor dengan pembunuhan manual dan zero timeout:

 4976 ?        Ss     0:00 /usr/bin/python /usr/bin/supervisord --pidfile /var/run/supervisord.pid
 5422 ?        S      0:01  \_ [celerybeat] --schedule=/var/lib/celery/celerybeat-schedule-nadovmeste --loglevel=INFO                                                             
 6101 ?        Sl     0:00  \_ [celeryd.MainProcess] Running... (--loglevel=INFO)                                                           
 6108 ?        S      0:00      \_ [celeryd.PoolWorker-1]                                                                                       
 nadovmeste:~# kill 6101 & kill -9 6101 &

ps -afx:

 4976 ?        Ss     0:00 /usr/bin/python /usr/bin/supervisord --pidfile /var/run/supervisord.pid
 5422 ?        S      0:01  \_ [celerybeat] --schedule=/var/lib/celery/celerybeat-schedule-nadovmeste --loglevel=INFO                                                             
 6867 ?        Sl     0:00  \_ [celeryd.MainProcess] Running... (--loglevel=INFO)                                                           
 6875 ?        S      0:00      \_ [celeryd.PoolWorker-1]                                                                                       
 6108 ?        S      0:00 [celeryd.PoolWorker-1]       

Saya dapat mereproduksi ini hanya dengan balapan buatan antara kill dan kill -9 . Terkadang pekerja terbunuh dengan benar. Masalahnya tampaknya khusus untuk pengawas karena ketika saya memulai celeryd dari konsol, saya tidak beruntung mereproduksinya.

Saya dapat mereproduksi ini dengan skrip yang dimulai konsol setelah beberapa upaya:

/home/nadovmeste/envs/nadovmeste/bin/python /home/nadovmeste/src/nadovmeste/manage.py celeryd -B --loglevel=INFO&

dan kemudian di sesi terminal lain:

nadovmeste:~# ps -afx

 6450 ?        Ss     0:00  \_ sshd: root@pts/2 
 6452 pts/2    Ss+    0:00      \_ -bash
 9343 pts/2    Sl     0:00          \_ [celeryd.MainProcess] Running... (-B --loglevel=INFO)                                                           
 9350 pts/2    S      0:00              \_ [celeryd.PoolWorker-2]                                                                                          
 9355 pts/2    S      0:00              \_ [celerybeat]     

nadovmeste:~# kill 9343 & kill -9 9343

nadovmeste:~# ps -afx

 4526 ?        Ss     0:00  \_ sshd: root@pts/1 
 4529 pts/1    Ss     0:00  |   \_ -bash
 9366 pts/1    R+     0:00  |       \_ ps -afx
 6450 ?        Ss     0:00  \_ sshd: root@pts/2 
 6452 pts/2    Ss+    0:00      \_ -bash    
 ...
 9350 pts/2    S      0:00 [celeryd.PoolWorker-2]                                                                                          
 9355 pts/2    S      0:00 [celerybeat]

Belum menemukan opsi khusus untuk batas waktu tak terbatas dengan peringatan di dokumen pengawas. Mungkin jumlah yang sangat besar akan cukup jika itu yang kita inginkan.

Mungkin itu sesuatu yang terkait dengan celerybeat karena saya dapat mereproduksi masalah untuk celeryd yang dimulai dari konsol hanya setelah menggunakan opsi -B .

Jika saya menguji beberapa tugas seledri secara lokal dan saya menggunakan opsi -B terkadang prosesnya tidak dimatikan ketika saya menggunakan ctrl-c.

Saya tidak dapat mereproduksi ini secara lokal. Btw, apakah Anda menjalankan cabang master? Saya baru saja memperbaiki bug yang dapat menyebabkan shutdown. Jika Anda bisa menguji dengan ini, itu akan menyenangkan.

Ya, saya menjalankan cabang master terbaru. Saya melihat komit perbaikan bug Anda dan berharap itu akan membantu tetapi tampaknya itu tidak membantu dalam kasus saya: seledri terbaru tampaknya berperilaku sama. Tetapi ada kemungkinan bahwa masalah awal telah terpecahkan - saya memeriksa ini hanya dengan pembunuhan langsung. Tidak dapat membungkusnya sekarang :) Masalah ctrl-c tidak dapat direproduksi dengan pengaturan saya.

Jadi laporan bug, disederhanakan: http://Gist.github.com/401028 . Hasilnya selalu sama (tidak kadang-kadang). Saya memiliki beberapa tugas periodik dan beberapa non-periodik. Tugasnya sederhana dan tidak membutuhkan banyak waktu untuk menyelesaikannya. Apakah ini bug yang diproses anak-anak tetap hidup setelah mematikan proses utama? Jika demikian dan Anda tidak dapat mereproduksinya maka saya akan mencoba memberikan proyek minimal.

Perilaku membunuh celerybeat menarik: ketika saya mematikan proses celerybeat yang menggantung(?), proses pekerja yang menggantung juga mati.

@kmike Saya masih tidak dapat mereproduksi dengan perintah di atas. Mungkin karena saya menggunakan OS X, atau mungkin Anda menjalankan Python 2.5? (Saya menjalankan 2.6.1)

Dapat menjalankannya dengan --loglevel=DEBUG? Ini dapat memberikan beberapa info tentang di mana ia berhenti.

Proses celerybeat dimulai dari proses utama, jadi saya berasumsi proses utama sedang menunggu
agar celerybeat keluar sebelum membunuh proses kumpulan yang tersisa.

Saya pikir proses utama terbunuh: tidak terlihat dalam daftar proses. Tidak memiliki banyak pengalaman dengan manajemen proses sekalipun.

Setup saya adalah Debian Lenny + python 2.5.

Saya akan mencoba menjalankan celeryd dengan --loglevel=DEBUG dan mereproduksinya di macbook saya.

hmm, kau benar tentu saja. Ini hampir seperti proses beat mengambil alih proses pool.

Saya baru saja mencoba mereproduksi di Debian Lenny dengan python 2.5, dan itu berfungsi di sana.
Mencoba membunuh dengan TERM dan INT.

Tanya, terima kasih atas bantuannya.

Saya pikir masalah awal telah diselesaikan dengan peningkatan batas waktu pengawas dan komit perbaikan bug Anda. Simulasi tidak benar karena saya menggunakan perintah kill -9 dan mereka mengirim sinyal KILL alih-alih TERM. Dengan proses sinyal TERM terbunuh dengan benar.

Pengawas menggunakan sinyal TERM jadi semuanya akan baik-baik saja.

Tetapi hal yang membuat saya sedikit takut adalah bahwa bug awal tidak diselidiki. Saya akan mencoba mereproduksinya dan memberi tahu Anda.

Ah! Saya minta maaf. Saya tidak membaca masalah dengan cukup hati-hati. Ya! Itulah yang terjadi ketika Anda membunuhnya dengan SIGKILL. Sinyal 9 tidak dapat ditangkap, jadi tidak ada yang bisa kami lakukan tentang AFAIK ini.

Jika Anda masih mengalami masalah dalam menghentikan pekerja Seledri Anda, Anda dapat mencoba menyetel stopasgroup=true sebelum meningkatkan stopwaitsecs Anda.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat