Saya mengoperasikan sistem Linux yang memiliki banyak pengguna tetapi kadang-kadang terjadi penyalahgunaan; di mana pengguna dapat menjalankan proses tunggal yang menggunakan lebih dari 80% dari CPU / Memori.
Jadi apakah ada cara untuk mencegah hal ini terjadi dengan membatasi jumlah penggunaan CPU yang bisa digunakan oleh proses (hingga 10% misalnya)? Saya sadar cpulimit
, tetapi sayangnya menerapkan batas untuk proses yang saya perintahkan untuk membatasi (misalnya proses tunggal). Jadi pertanyaan saya adalah, bagaimana saya bisa menerapkan batas untuk semua proses dan proses yang berjalan yang akan berjalan di masa depan tanpa perlu memberikan id / path mereka misalnya?
centos
command-line
cpu
limit
Giovanni Mounir
sumber
sumber
cpulimit
bersama skrip pencarian Anda. Memiliki kebijakan dan merekomendasikan penggunaancpulimit
, kemudian mencari lebih dari 10% dan kemudian membatasi hingga 5% (sehingga pengguna disarankan untuk menggunakancpulimit
). Pastikan juga Anda dapat mendeteksi beberapa proses yang menambahkan hingga lebih dari 10% untuk satu pengguna.cpulimit
jauh lebih baik daripada hanya membunuh proses karena dapat dimulai kembali oleh pengguna nanti (seperti yang ditunjukkan dalam salah satu komentar Anda). Terima kasih!Jawaban:
Meskipun bisa menjadi penyalahgunaan memori, itu bukan untuk CPU: ketika CPU diam, proses yang berjalan (dengan "berjalan", maksud saya bahwa proses itu tidak menunggu I / O atau sesuatu yang lain) akan mengambil Waktu CPU 100% secara default. Dan tidak ada alasan untuk memberlakukan batas.
Sekarang, Anda dapat mengatur prioritas berkat
nice
. Jika Anda ingin mereka berlaku untuk semua proses untuk pengguna tertentu, Anda hanya perlu memastikan bahwa shell loginnya dijalankan dengannice
: proses anak akan mewarisinice
nilai. Ini tergantung pada bagaimana pengguna login. Lihat memprioritaskan ssh login (bagus) misalnya.Atau, Anda dapat mengatur mesin virtual. Memang menetapkan batas per-proses tidak masuk akal karena pengguna dapat memulai banyak proses, menyalahgunakan sistem. Dengan mesin virtual, semua batasan akan bersifat global ke mesin virtual.
Solusi lain adalah menetapkan
/etc/security/limits.conf
batasan; lihat halaman manual membatasi.conf (5). Misalnya, Anda dapat mengatur waktu CPU maksimum per login dan / atau jumlah proses maksimum per login. Anda juga dapat mengaturmaxlogins
ke 1 untuk setiap pengguna.sumber
bagus / renice
nice
adalah alat yang bagus untuk 'one off' tweak ke suatu sistem.cpulimit
cpulimit
jika Anda perlu menjalankan pekerjaan intensif CPU dan memiliki waktu CPU yang bebas sangat penting untuk responsif suatu sistem.cgroups
cgroups
menerapkan batasan pada serangkaian proses, daripada hanya satuSumber daya
http://blog.scoutapp.com/articles/2014/11/04/restricting-process-cpu-usage-using-nice-cpulimit-and-cgroups
sumber
cpu.cfs_quota_us
parameter (lihat manual )sudo cgclassify -g cpu:cpulimited 2315444
Apakah Anda melihat cgroup? Ada beberapa informasi di Arch Wiki tentang mereka. Baca bagian tentang
cpu.shares
, sepertinya melakukan apa yang Anda butuhkan, dan mereka dapat beroperasi pada tingkat pengguna, sehingga Anda dapat membatasi semua proses pengguna sekaligus.sumber
Untuk memori, apa yang Anda cari adalah
ulimit -v
. Catatan yangulimit
diwarisi oleh proses anak, jadi jika Anda menerapkannya pada shell login pengguna pada saat login, itu berlaku untuk semua prosesnya.Jika semua pengguna Anda menggunakan
bash
shell login, memasukkan baris berikut ini/etc/profile
akan menyebabkan semua proses pengguna memiliki batas keras 1 gigabyte (lebih tepatnya, satu juta kilobyte):Opsi
H
ini memastikan bahwa ini adalah batas yang sulit, yaitu, pengguna tidak dapat mengaturnya kembali setelahnya. Tentu saja pengguna masih dapat mengisi memori dengan memulai cukup banyak proses sekaligus.Untuk cangkang lain, Anda harus mencari tahu file inisialisasi apa yang mereka baca (dan perintah
ulimit
apa yang digunakan alih-alih ).Untuk CPU, apa yang Anda inginkan sepertinya tidak masuk akal bagi saya. Apa gunanya membiarkan 90% CPU tidak digunakan saat hanya satu proses yang berjalan? Saya pikir apa yang sebenarnya Anda inginkan
nice
(dan mungkinionice
). Perhatikan bahwa, sepertiulimit
,nice
nilai diwarisi oleh proses anak, jadi menerapkannya pada shell login saat waktu login sudah cukup. Saya kira itu juga berlaku untukionice
tetapi saya tidak yakin.sumber
nice
cukup baik untuk melakukan ini? Jika demikian, apakah Anda pikir Anda dapat menunjukkan kepada saya contoh untuk mencapai ini?Karena Anda menyatakan bahwa cpulimit tidak akan praktis dalam kasus Anda, maka saya sarankan Anda melihat nice , renice , dan tasket , yang mungkin mendekati apa yang ingin Anda capai, meskipun tasket memungkinkan untuk mengatur afinitas CPU suatu proses, sehingga mungkin tidak segera membantu dalam kasus Anda.
sumber
nice
danrenice
? Itu bagus! Saya telah melihat halaman manual mereka, tetapi saya masih berpikir mereka tidak dapat membantu karena Anda masih harus menetapkan ID proses. Namun jika Anda bisa memberi saya contoh yang melibatkan paket-paket ini untuk menerapkan batas pada semua proses yang sedang berjalan / proses masa depan yang akan luar biasa!Karena tag Anda miliki
centos
, Anda dapat menggunakansystemd
.Misalnya jika Anda ingin membatasi pengguna dengan ID dari
1234
:sudo systemctl edit --force user-1234.slice
Kemudian ketik dan simpan ini:
[Slice] CPUQuota=10%
Lain kali ketika pengguna masuk, itu akan mempengaruhi.
Man:
systemctl
,systemd.slice
,systemd.resource-control
...sumber
Jika Anda ingin membatasi proses yang sudah dimulai, Anda harus melakukannya satu per satu dengan PID, tetapi Anda dapat memiliki skrip batch untuk melakukannya seperti di bawah ini:
Dalam kasus saya
pypdfocr
meluncurkan serakahtesseract
.Juga dalam beberapa kasus adalah CPU Anda cukup baik Anda bisa menggunakan
renice
seperti ini:sumber