Bagaimana cara meningkatkan batas file terbuka untuk pengguna non-root?

144

Ini terjadi pada Ubuntu Release 12.04 (tepat) 64-bit Kernel Linux 3.2.0-25-virtual

Saya mencoba meningkatkan jumlah file terbuka yang diizinkan untuk pengguna. Ini untuk aplikasi java gerhana saya di mana batas saat ini 1024 tidak cukup.

Menurut posting yang saya temukan sejauh ini, saya seharusnya bisa memasukkan garis

/etc/security/limits.conf menyukai ini:

soft nofile 4096
hard nofile 4096

untuk meningkatkan jumlah file terbuka yang diizinkan untuk semua pengguna.

Tapi itu tidak berfungsi untuk saya dan saya pikir masalahnya tidak terkait dengan file itu.

Untuk semua pengguna, batas default adalah 1024, terlepas dari apa yang ada di /etc/security/limits.conf (saya reboot setelah mengubah file itu)

$ ulimit -n
1024

Sekarang, meskipun ada entri di /etc/security/limits.conf saya tidak bisa meningkatkannya:

$ ulimit -n 2048

-bash: ulimit: buka file: tidak dapat mengubah batas: Operasi tidak diizinkan Bagian yang aneh adalah bahwa saya dapat mengubah batas ke bawah , tetapi tidak dapat mengubahnya ke atas - bahkan untuk kembali ke nomor yang di bawah batas asli:

$ ulimit -n 800
$ ulimit -n
800

$ ulimit -n 900

-bash: ulimit: open files: cannot modify limit: Operation not permitted

Sebagai root, saya dapat mengubah batas itu ke apa pun yang saya inginkan, naik atau turun. Bahkan tampaknya tidak peduli tentang batas sistem yang seharusnya dalam / proc / sys / fs / file-max

# cat /proc/sys/fs/file-max
188897

# ulimit -n 188898
# ulimit -n 
188898

Tetapi bahkan saya mendapatkan gerhana untuk dijalankan sebagai root, aplikasi saya masih macet karena pengecualian "Terlalu Banyak Buka File"!

Sejauh ini, saya belum menemukan cara untuk meningkatkan batas file terbuka untuk pengguna non-root.

Bagaimana seharusnya saya melakukan ini dengan benar? Saya telah melihat beberapa posting lain tetapi tidak berhasil!

iCode
sumber
6
Juga, perhatikan bahwa setelah Anda mengedit /etc/security/limits.conf, Anda mungkin harus keluar dan kembali sebelum Anda dapat menggunakan batas maksimum yang baru. Saya melakukan ini, dan bingung dengan ulimit -Hsmasih menampilkan 1000 ketika saya baru saja menaikkannya menjadi 10.00000! Kemudian saya logout dan kembali, dan ulimit menunjukkan jumlah yang baru.
Cerin
Untuk sesi GUI Anda mungkin menemukan utas ini penting (Ubuntu 16+) .
Waldemar Wosiński

Jawaban:

142

The ulimitperintah secara default perubahan batas-batas KERAS, yang Anda (pengguna) dapat menurunkan, tapi tidak bisa menaikkan.

Gunakan opsi -S untuk mengubah batas SOFT , yang dapat berkisar dari 0- { HARD }.

Saya benar-benar alias ulimituntuk ulimit -S, jadi default untuk batas lembut sepanjang waktu.

alias ulimit='ulimit -S'

Adapun masalah Anda, Anda kehilangan kolom di entri Anda di /etc/security/limits.conf.

Seharusnya ada EMPAT kolom, tetapi yang pertama tidak ada dalam contoh Anda.

* soft nofile 4096
* hard nofile 4096

Kolom pertama menjelaskan kepada WHO batasan yang harus dilamar. '*' adalah wildcard, artinya semua pengguna. Untuk menaikkan batas root , Anda harus secara eksplisit memasukkan 'root' daripada '*'.

Anda juga perlu mengedit /etc/pam.d/common-session*dan menambahkan baris berikut sampai akhir:

session required pam_limits.so
lornix
sumber
1
Bagaimana cara mengubah batas Hard untuk jumlah maksimum deskriptor file terbuka? Masalah saya adalah bahwa saya perlu mengizinkan aplikasi Eclipse saya untuk memiliki sebanyak file terbuka seperti yang diinginkan tetapi batas 4096 tidak cukup dan saya ingin mengaturnya setinggi mungkin mungkin 500.000. Pengaturan saya di membatasi. seperti yang Anda sebutkan dengan bintang dan masih batas Hard tidak bergerak.
iCode
1
Nah, Anda menemukan nilai / proc / sys / fs / file-max adalah 188.897 ... Jadi saya katakan batas atas Anda adalah antara 188.000 (diizinkan) dan 500.000 (tidak diizinkan). Meregangkan pikiran bahwa Anda memiliki sesuatu yang membutuhkan lebih dari 65.000 file terbuka secara bersamaan. Wow. Biasanya itu ditangani dengan menggunakan besi besar. Saya akan curiga terhadap pemrograman, eh, kesalahpahaman. (Dengan segala hormat, silakan)
lornix
4
itu dia: sesi diperlukan pam_limits.so, terima kasih!
lethalman
13
Pada awalnya saya ketinggalan wildcard di akhir /etc/pam.d/common-session*dan baru diedit common-session, dan bahkan setelah reboot tidak berhasil. Tetapi setelah menambahkan baris yang sama (untuk pam_limits.so) ke common-session-noninteractive, ulimit -nditampilkan nilai baru setelah login baru (tidak perlu reboot). FWIW Saya mencoba mengubah batas untuk root (hanya).
Lambart
1
juga periksa apakah nilainya berbeda jika login sebagai root. superuser.com/questions/1200539/…
Robbo_UK
20

Jika Anda menggunakan batas lunak dan keras per pengguna, Anda dapat menggunakan sesuatu seperti:

su USER --shell /bin/bash --command "ulimit -n"

untuk memeriksa apakah pengaturan Anda berfungsi untuk pengguna tertentu atau tidak.

Jeroen Teeuwen
sumber
5

Saya memiliki banyak masalah untuk menjalankan ini.

Menggunakan berikut ini memungkinkan Anda untuk memperbaruinya terlepas dari izin pengguna Anda.

sudo sysctl -w fs.inotify.max_user_watches=100000
Layke
sumber
4
Saya mencoba ini karena saya mengalami masalah yang sama tetapi tidak berhasil$ sudo sysctl -w fs.inotify.max_user_watches=100000 fs.inotify.max_user_watches = 100000 $ ulimit -n 1024
grepmaster