Ubah ulimit (buka file) dari proses tertentu

27

Apakah mungkin untuk mengubah batas lunak dan keras dari proses tertentu ?

Dalam kasus saya, proses saya adalah mongoddan banyak sumber daya web memberitahu saya untuk hanya menjalankan:

ulimit -n <my new value>

Pikiran saya saat ini:

  • Bagaimana perintah mengetahui batas proses yang akan saya modifikasi? Tidakkah ini akan mengubah batas seluruh sistem file terbuka?
  • Saya menduga bahwa perintah ini hanya mengubah batas lunak. Jadi apakah ada cara untuk meningkatkan batas keras juga?
uji
sumber
Sudahkah Anda membaca informasi yang berharga ini? docs.mongodb.org/manual/reference/ulimit
tink
Ya saya hafal semuanya. Saya tidak yakin apakah saya kehilangan sesuatu tetapi halaman itu hanya memberi tahu Anda cara MELIHAT detailnya. Ini hanya memberitahu Anda untuk menulis ulimit -n <nilai> ...
test

Jawaban:

29

Suatu proses dapat mengubah batasnya melalui setrlimit(2)panggilan sistem. Ketika Anda menjalankan ulimit -nAnda harus melihat nomor. Itulah batas saat ini pada jumlah deskriptor file terbuka (yang termasuk file, soket, pipa, dll) untuk proses. The ulimitperintah mengeksekusi getrlimit(2)system call untuk mencari tahu apa nilai saat ini.

Inilah intinya: sebuah proses mewarisi batas saat ini dari proses induknya Jadi, jika Anda menjalankan, ulimit -n 64Anda akan menetapkan batas shell dari deskriptor file terbuka menjadi 64. Setiap proses yang dimulai shell akan memiliki batas yang sama, kecuali jika proses baru memanggil dengan setrlimit()tepat.

Untuk mengubah mongodb'sbatas deskriptor file terbuka, Anda akan menjalankan ulimit -n 2048(atau apa pun jumlah besar kernel Anda memungkinkan) dalam sebuah shell. Anda kemudian akan menggunakan shell itu untuk memulai mongodb. Sebagai proses anak, mongodbakan mewarisi batas (besar) pada deskriptor file terbuka.

Untuk memodifikasi batas file terbuka sistem, yang sepertinya lebih seperti jumlah dari semua proses batas deskriptor file terbuka, Anda harus melakukan sesuatu seperti memodifikasi /etc/sysctl.confdan menjalankan sysctl -p. Lihatlah nilai fs.file-maxparameter di /etc/sysctl.conf.

Bruce Ediger
sumber
Sungguh penjelasan yang bagus! Terima kasih banyak. Saya akan mencoba ini segera!
Tes
Jawaban ini banyak membantu saya, tetapi masalahnya sekarang adalah bahwa batas yang sulit adalah 2048, dan ini tidak cukup dalam kasus saya. 1) bagaimana saya bisa menemukan batas yang diizinkan oleh kernel saya? 2) Apakah mungkin untuk mengubah BATAS KERAS sekarang? Terima kasih lagi!
Tes
@test - Saya tidak pernah menaikkan batas yang sulit. Ditemukan ini: blog.samat.org/2011/04/05/... dan ini wiki.brekeke.com/wiki/Increase-File-Descriptor-Limit-on-Linux Mereka mengatakan hal yang sama.
Bruce Ediger
18

Untuk mengubah batas proses yang sedang berjalan, Anda dapat menggunakan perintah utilitas prlimit.

prlimit --pid 12345 --nofile=1024:1024

Apa yang dilakukan secara internal adalah menelepon setrlimit(2). Halaman manual prlimit harus berisi beberapa contoh doa yang berguna.

Sumber: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/

pengguna7610
sumber
Ini menyelamatkan hari saya, terima kasih. Saya telah lama menjalankan proses Python yang menghasilkan too many files openkesalahan. Jawaban Anda menyelesaikan masalah saya tanpa menghentikan proses.
Visionscaper
1

Setidaknya di Linux, sebagian besar distro tampaknya menggunakan pam untuk otentikasi. Satu modul yang dilengkapi dengan pam adalah modul limit . Mengutip dari README untuk pam_limits:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

Sebagai hasilnya, Anda dapat menetapkan batas per pengguna, per grup, dan standar, dalam kedua kategori tersebut keras (root menyetel ini dan proses tidak dapat meminta lebih tinggi) dan batas lunak. Batas lunak biasanya ditetapkan lebih rendah dari batas keras, dan aplikasi dapat meningkatkannya hingga mencapai batas keras.

Dalam kasus Anda, jika proses yang Anda inginkan untuk meningkatkan batas berjalan sebagai pengguna biasa, Anda dapat meningkatkan batas untuk pengguna atau grup itu. Sebagai contoh, saya memiliki beberapa tugas cs mysql di beberapa server yang memerlukan pegangan file ekstra untuk dibuka, jadi saya mengatur ini:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

Tidak ada yang perlu direstart; ketika Anda su ke pengguna itu, Anda dapat segera melihat bahwa batas baru berlaku.

Hal lain yang dapat Anda lakukan jika Anda menggunakan sistem turunan RedHat adalah memasukkan panggilan ulimit yang Anda inginkan ke dalam skrip / etc / sysconfig / $ SERVICE. Sebagai contoh, skrip init apache bernama /etc/init.d/httpd, dan sumber file konfigurasi / etc / sysconfig / httpd jika ditemukan. Saya merasa lebih mudah untuk mengelola dengan melakukan ini daripada mengedit skrip init itu sendiri karena skrip init dapat diperbarui ketika rpm ditingkatkan, tetapi file sysconfig hanya diperbarui jika mereka tidak diubah dari default.

Todd Lyons
sumber
Solusi terbaik dan paling praktis.
nelaaro
0

Bagaimana perintah mengetahui batas proses yang akan saya modifikasi? Tidakkah ini akan mengubah batas seluruh sistem file terbuka?

Perintah akan mengubah batas untuk proses saat ini (shell Anda) dan proses anak apa saja (apa pun yang Anda jalankan dari shell selanjutnya).

Proses diatur dalam pohon. Setiap proses memiliki orang tua (yang memintanya). Proses nomor 1, init, adalah proses khusus karena merupakan induknya sendiri. Alat seperti htop atau atas dapat menunjukkan kepada Anda proses yang ditampilkan sebagai pohon orang tua dan anak-anak.

pengguna7610
sumber