Bagaimana mencegah begitu banyak contoh menjalankan apt-check?

18

Saya memiliki server Ubuntu 12,04 yang baru saja crash karena sebab yang sangat jelas: 30+ apt-checkproses memakan semua memori, pembunuh OOM menendang, membunuh layanan vital. Saya tidak yakin dari mana apt-checkproses itu berasal, tetapi saya kira plugin Nagios / Icinga saya check_aptmungkin menggunakannya, dan juga byobubaris status mungkin ingin menampilkan outputnya. Saya kira ada sesuatu yang terkunci dan semua proses hanya menunggu, namun menyimpan memori.

Bagaimana saya mencegah agar ada begitu banyak contoh apt-checkpada sistem? Itu tidak masuk akal bagi saya dan harus berhenti begitu saja tidak bisa mendapatkan kunci baca pada basis data dpkg.

Sepertinya saya bukan satu-satunya yang mengalami masalah di sini. Semua saran apt-checksangat negatif:

masukkan deskripsi gambar di sini

(browser bersih, tidak login, tidak ada pencarian yang dipersonalisasi)

gertvdijk
sumber

Jawaban:

8

Beberapa orang apt-checkmemberi saya petunjuk ini karena merupakan skrip yang sangat tumpul yang perlu diperbaiki. Dengan segala hormat kepada penulisnya, ini gagal pada server saya. Inilah pikiran saya:

  • apt-check == /usr/lib/update-notifier/apt_check.py
  • memaksa nicelevel 19 untuk dirinya sendiri
  • tidak ada batas waktu yang ditetapkan pada tindakan

Kombinasi dua yang terakhir memungkinkannya menumpuk tanpa henti dalam spiral ke bawah. Jika sistem digunakan untuk tujuan lain dengan prioritas lebih tinggi, jumlah proses hanya akan meningkat dan tidak ada akhirnya, karena apt-checktidak akan pernah mendapatkan prioritas apa pun darinya. Masalah hanya akan bertambah buruk begitu pembunuh OOM memutuskan untuk membunuh proses sistem vital Anda.

Jika salah satu dari dua aspek dalam perilaku ini berbeda, itu tidak akan membiarkan sistem berakhir dalam keadaan rusak seperti itu adalah asumsi saya.

Sementara string benar tentang proses induk yang bertanggung jawab dalam hal ini juga, saya percaya poin di bawah ini adalah cacat apt-checkdan harus dilaporkan sebagai bug untuk ditangani dengan benar:

  • itu seharusnya mengisyaratkan pembunuh OOM untuk dirinya sendiri terbunuh terlebih dahulu
  • seharusnya tidak mengatur hardcode nicelevel
  • itu harus keluar jika dibutuhkan jumlah waktu yang tidak masuk akal untuk mendapatkan informasi

Sebenarnya, tampaknya pembunuh OOM Linux melakukan beberapa heuristik pada ini. Proses Niced akan mendapatkan skor yang meningkat, dan proses yang berjalan lama berkurang. ( sumber - terima kasih kepada Ulrich Dangel karena menunjukkannya )

Solusi yang mungkin saya usulkan:

  • hasil cache setelah diproses
  • cache keluaran jika kurang dari N jumlah detik tanpa memuat semua pustaka Python-APT untuk setiap --helppemanggilan yang sederhana ( datar).
  • buatlah nicelevel dapat dikonfigurasi - Izinkan saya untuk mengubah / menonaktifkan ini! Saya percaya bahwa pengaturan ke 0 akan benar-benar membantu
  • memilikinya meningkatkan skor pembunuh OOM
gertvdijk
sumber
Saya pikir Anda telah melewatkan hal terbesar yang harus dilakukan: gunakan lockfile dan tidak mengizinkan lebih dari satu contoh dijalankan sekaligus.
derobert
@derobert Ini adalah skrip yang dapat dijalankan oleh setiap pengguna, tanpa hak khusus di Ubuntu, bukan daemon. Atau bisakah saya menggunakan /var/run/ /tmpuntuk file kunci yang dapat dibaca dunia / dapat ditulis ini dengan aman? Lubang besar di sana: tambahkan file kunci dan admin tidak akan diberi tahu tentang pembaruan sistem!
gertvdijk
Apa pun yang meluncurkannya secara otomatis (mengarah ke 30+ salinan berjalan) perlu melakukan penguncian. Atau bisa melakukannya sendiri, per pengguna. Either way, itu bug yang perlu dipecahkan.
derobert
Nagios / Icinga tampaknya menghindari jebakan. Setidaknya, ada 10s batas waktu dan memperingatkan jika terlampaui. (Meskipun saya tidak dapat menemukan cara mengkonfigurasi batas waktu - saya lebih suka lebih lama). Byobu pada Debian adalah apa yang menyebabkan masalah bagi saya; di Ubuntu itu seharusnya diperbaiki .
sourcejedi
4

Anda perlu mencari tahu proses apa yang menelurkan apt-check. Anda dapat menggunakan sesuatu seperti ps untuk mendapatkan pohon proses.

ps -A --forest

Jika apt-check tidak memiliki orang tua, maka itu mungkin masalah dengan apt-check sendiri dan bukan satu program tertentu. jika itu masalahnya saya akan mencoba untuk debug apt-check.

string
sumber
Terima kasih. Beri aku beberapa ide untuk melihat lebih jauh. Namun, ini membuat saya percaya itu masalah yang apt-checksangat - lihat jawaban saya sendiri .
gertvdijk
Jika itu menghabiskan memori dan waktu CPU, itu bukan zombie.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles poin bagus.
string
0

Basis tertulis di Ubuntu 12.04

Saya memiliki masalah yang sama dan menemukan itu karena byobu, jika saya hanya menjalankan apt-get updatetidak menggunakan byobu, tidak akan ada check-aptproses. Juga, berkaitan dengan update-notifierpaket, ketika saya dihapus paket mereka (update-notifer-umum, update-notifier), menggunakan byobudan menjalankan apt-get update, itu berlari perintah lain tapi cukup memori yang sama dengan menggunakan: apt-get -s -o Debug::NoLocking=true upgrade.

Beberapa hal lain dapat berjalan apt-get update(tetapi mungkin tidak berjalan check-apt)

Di desktop, ada lebih banyak hal yang mungkin terlibat.

Kesimpulan: byobumenangkap peristiwa ketika Anda menjalankan apt-get updatedan memicu check-aptproses ini , mengkonfigurasi ulang bilah status byobuuntuk memperbaikinya.

HVNMencintai
sumber