Batasi jumlah deskriptor file

34

Saya mencoba menginstal 389-ds, Dan ini memberi saya peringatan ini:

WARNING: There are only 1024 file descriptors (hard limit) available, which limit the number of simultaneous connections.

Saya mengerti tentang deskriptor file, tetapi saya tidak mengerti tentang batasan lunak dan keras.

Ketika saya berlari cat /proc/sys/fs/file-max, saya kembali 590432. Ini harus menyiratkan bahwa saya dapat membuka hingga 590432 file (yaitu memiliki hingga 590432 file deskriptor.

Tetapi ketika saya berlari ulimit, itu memberi saya hasil yang berbeda:

$ ulimit
unlimited

$ ulimit -Hn    # Hard limit
4096

$ ulimit -Sn    # Soft limit
1024

Tapi dari apa batas keras / lunaknya ulimit, dan bagaimana kaitannya dengan nomor yang disimpan di /proc/sys/fs/file-max?

Rafael Adel
sumber

Jawaban:

39

Menurut dokumentasi kernel , /proc/sys/file-maxadalah jumlah maksimum, jumlah global deskriptor file yang akan dialokasikan kernel sebelum tersedak. Ini adalah batas kernel, bukan pengguna Anda saat ini. Jadi Anda dapat membuka 590432, asalkan Anda sendirian di sistem siaga (mode pengguna-tunggal, tidak ada daemon yang berjalan).

Perhatikan bahwa dokumentasinya sudah usang: file telah proc/sys/fs/file-maxlama. Terima kasih kepada Martin Jambon karena menunjukkan ini.

Perbedaan antara batas lunak dan keras dijawab di sini, di SE . Anda dapat menaikkan atau menurunkan batas lunak sebagai pengguna biasa, asalkan Anda tidak melampaui batas keras. Anda juga dapat menurunkan batas keras (tetapi Anda tidak dapat menaikkannya lagi untuk proses itu). Sebagai superuser, Anda dapat menaikkan dan menurunkan batas keras dan lunak. Skema batas ganda digunakan untuk menegakkan kebijakan sistem, tetapi juga memungkinkan pengguna biasa untuk menetapkan batas sementara untuk diri mereka sendiri dan kemudian mengubahnya.

Perhatikan bahwa jika Anda mencoba menurunkan batas keras di bawah batas lunak (dan Anda bukan superuser), Anda akan EINVALkembali (Argumen Tidak Valid).

Jadi, dalam kasus khusus Anda, ulimit(yang sama dengan ulimit -Sf) mengatakan Anda tidak memiliki batas lunak pada ukuran file yang ditulis oleh shell dan subprosesnya . (itu mungkin ide yang bagus dalam banyak kasus)

Doa lain, ulimit -Hnlaporan tentang -nbatas (jumlah maksimum deskriptor file yang terbuka), tidak pada -fbatas, yang mengapa batas lembut tampaknya lebih tinggi dari batas keras. Jika Anda memasukkan ulimit -HfAnda juga akan mendapatkan 'tidak terbatas'.

Alexios
sumber
14
Di Linux 4.4.0, path file-max adalah /proc/sys/fs/file-max.
Martin Jambon
tolong apakah batas keras ulimit -Hn menargetkan batas sistem untuk kemampuan deskriptor file yang dialokasikan?
Webwoman
2
@ Webman: tidak, tidak. ulimithanya memengaruhi batas proses saat ini . Batas-batas dari proses saat ini diwariskan untuk proses anak-anak juga, tetapi setiap proses memiliki jumlah yang terpisah. Misalnya dengan ulimit -Hn 10, Anda hanya dapat membuka 10 deskriptor file pada satu waktu. Setiap proses anak yang Anda buat hanya dapat memiliki hingga 10 deskriptor file juga. Hanya pengguna super yang dapat meningkatkan batas setelah ditetapkan. Jika Anda menetapkan satu terlalu rendah, satu-satunya pilihan Anda mungkin untuk mematikan proses shell Anda dan memulai yang baru.
Alexios
0

Panggilan sistem "pilih" adalah salah satu dari banyak keputusan desain mati otak yang mengerikan dari unix yang membuat bahkan windows95 tetap terlihat begitu baik dibandingkan.

Seharusnya sudah dilarang 20 tahun yang lalu dan kita sekarang mungkin memiliki kemampuan untuk penangan file tanpa batas tanpa masalah.

Anda dapat menambah jumlah deskriptor file dengan mudah dengan konfigurasi kernel dan ulimit TETAPI ingat bahwa jika perpustakaan manapun menggunakan "pilih" system call program Anda akan menjadi tidak stabil (kerusakan memori) dan gagal.

Select hanya dapat menangani deskriptor file dari 0 hingga 1023 dan jika Anda memberi makan deskriptor dengan nilai yang lebih tinggi, itu akan muncul secara acak di memori Anda dan pilih tidak akan pernah mengulang deskriptor berfungsi. Sayangnya banyak perpustakaan menggunakan pilih.

Lothar
sumber
Komentar Anda adalah peringatan yang berguna, tetapi alih-alih mengambil nada mengomel, itu akan jauh lebih berguna untuk mengutip fd_set(3)halaman manual dan bahwa batasnya berasal FD_SETSIZE. Dan yang terbaik adalah saran panggilan pengganti seperti poll(3), seperti dalam jawaban
Davor Cubranic