Perbedaan antara ulimit -n dan / proc / $ PID / limit

9

Di Linux, ada batas file terbuka. Saya dapat menggunakan ulimit -nuntuk melihat batas file terbuka, yang merupakan 1024 default. Kemudian saya juga bisa melihat per proses buka file soft / hard limit dengan melihat / proc / $ PID / limit. Saya melihat soft = 1024 dan hard = 4096.

Saya bertanya-tanya apa perbedaan antara kedua output ini?

Juga, apakah setRlimit()dan getRlimit()berlaku untuk seluruh sistem atau per proses?

sdeLevelNegativeTwo
sumber

Jawaban:

11

ulimit -nmengatur batas lunak secara default; Anda dapat menambahkan -Hopsi untuk melihat / mengatur batas hard.

Sebagian besar, batas lunak dan keras berperilaku seperti ini:

  1. proses root (sebenarnya, proses dengan CAP_SYS_RESOURCE) dapat menaikkan atau menurunkan batas pada proses apa pun.
  2. setiap proses pengguna dapat menurunkan batas pada proses lain yang dimiliki oleh pengguna itu.
  3. setiap proses pengguna dapat menaikkan batas lunak hingga batas keras pada proses yang dimiliki oleh pengguna tersebut.
  4. Jika suatu proses mencoba untuk melampaui batas lunaknya, upaya itu akan gagal.

Jadi, batas keras berfungsi sebagai batas pada batas lunak (kecuali untuk root, yang seperti biasa dapat melakukan apa saja).

Ada pengecualian: Batas CPU lunak mengirim SIGXCPUsinyal. Suatu proses dapat memilih untuk mengabaikan itu, atau menghabiskan waktu melakukan pembersihan, dll. Setelah batas CPU yang keras dilewati, kernel mengirimkan SIGKILL— yang tidak dapat ditangkap, ditangani, atau diabaikan. Jadi dalam hal ini, batas lunak berfungsi sebagai peringatan "Anda kehabisan waktu CPU — selesaikan dan keluar segera, atau yang lain!" dan batas yang sulit adalah "atau yang lain."

Sebagian besar adalah per-proses, tetapi beberapa (seperti RLIMIT_NPROC) per pengguna. The getrlimit (2) panduan menspesifikasikan halaman untuk setiap batas.

derobert
sumber
Pertanyaan terkait lainnya, mengapa terkadang shell saya memiliki ulimit -n = 1024 dan proses lain yang dipecat dari shell ini memiliki soft limit = 4096 (membaca dari / proc / PID / limit)
sdeLevelNegativeTwo
@sdeLevelNegativeTwo Apakah Anda mematikan proses sebelum atau setelah ulimit -n? Itu tidak memengaruhi proses yang sudah diluncurkan, hanya shell dan yang akan datang. Selain itu, proses mungkin menaikkan batas lunaknya ke batas keras. Jadi bisa Anda gunakan ulimit -H -nuntuk menghentikannya.
derobert