Apakah nilai Limit.conf diterapkan pada basis per proses?

25

Saya menyetel nofilenilai /etc/security/limits.confuntuk pengguna oracle saya dan saya memiliki pertanyaan tentang perilakunya: apakah nofilemembatasi jumlah total file yang dapat dibuka pengguna untuk semua prosesnya atau apakah itu membatasi jumlah total file yang dapat dimiliki oleh pengguna terbuka untuk setiap prosesnya?

Secara khusus, untuk penggunaan berikut:

oracle                  hard    nofile                  65536
Christopher Neylan
sumber

Jawaban:

23

Sebagian besar nilai¹ dalam limits.confbatas yang dapat diatur dengan ulimitperintah shell atau setrlimitpanggilan sistem. Mereka adalah properti dari suatu proses. Batas berlaku secara independen untuk setiap proses. Secara khusus, setiap proses dapat nofilemembuka file. Tidak ada batasan untuk jumlah file terbuka yang diakumulasikan oleh proses pengguna.

The nprocbatas adalah sedikit kasus khusus, dalam hal itu jumlah seluruh proses dari pengguna. Meskipun demikian, itu masih berlaku per-proses: ketika suatu proses panggilan forkuntuk membuat proses baru, panggilan tersebut ditolak jika jumlah proses milik proses euid adalah akan lebih besar dari nilai proses RLIMIT_NPROC.

The limits.confhalaman manual menjelaskan bahwa batas berlaku untuk sesi. Ini berarti bahwa semua proses dalam suatu sesi semua akan memiliki batas yang sama (kecuali diubah oleh salah satu dari proses ini). Itu tidak berarti bahwa jumlah yang dilakukan selama proses dalam satu sesi (itu bahkan bukan sesuatu yang dilacak oleh sistem operasi - ada gagasan tentang sesi, tetapi itu lebih halus dari itu, misalnya setiap aplikasi X11 cenderung berakhir dalam sesi sendiri). Cara kerjanya adalah proses login menetapkan sendiri beberapa batasan, dan mereka diwarisi oleh semua proses anak.

¹ Pengecualiannya adalah maxlogins, maxsysloginsdan chroot, yang diterapkan sebagai bagian dari proses login untuk menolak atau memengaruhi login.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Sebaliknya, apakah itu berarti sesi yang berbeda dapat memiliki set batas yang berbeda?
CMCDragonkai
1
@ CMCDragonkai Ya, misalnya jika limit.confdiubah antara waktu sesi dibuka, atau jika batas yang berbeda (mereka harus lebih kecil kecuali untuk root) diatur .profile.
Gilles 'SANGAT berhenti menjadi jahat'
1
@laimison Jika Anda mengulangi semua proses yang sedang berjalan dan menjalankannya prlimit --pid $pid, Anda dapat secara efektif mengubah batas untuk sesi aktif. Perhatikan bahwa Anda mungkin harus melakukannya beberapa kali kalau-kalau beberapa proses bercabang saat Anda iterasi.
Gilles 'SANGAT berhenti menjadi jahat'
1
@laimison No. Misalkan pengguna hanya memiliki dua proses A dan B, dengan RLIMIT_NPROCset ke 2 di A dan ke 3 di B. Kemudian B dapat melakukan satu proses lagi, tetapi A tidak bisa.
Gilles 'SANGAT berhenti menjadi jahat'
1
@laimison Jika Anda menetapkan batas ke 2 pada induk B dan tidak mengubahnya dalam B setelah forking, maka batas B akan menjadi 2. Jika Anda menetapkan batas ke 2 pada induk B tetapi Anda menaikkan batas dalam B, atau jika Anda menetapkan batas ke 3 pada induk B sebelum mem-forking B dan menetapkannya menjadi 2 setelah mem-forking B, B akan memiliki batas yang ditetapkan ke 3. Satu-satunya batas yang penting adalah batas dalam proses yang memanggil fork (), bukan batas dalam induk proses itu atau dalam proses lainnya.
Gilles 'SANGAT berhenti menjadi jahat'