Jumlah maksimum file terbuka maksimum yang diizinkan di Linux


10

Apakah ada batasan (teknis atau praktis) untuk seberapa besar Anda dapat mengkonfigurasi jumlah maksimum file terbuka di Linux? Apakah ada beberapa efek buruk jika Anda mengonfigurasinya ke jumlah yang sangat besar (katakanlah 1-100M)?

Saya pikir penggunaan server di sini, bukan sistem embedded. Program yang menggunakan sejumlah besar file terbuka tentu saja dapat memakan memori dan menjadi lambat, tetapi saya tertarik pada efek yang merugikan jika batasnya dikonfigurasi jauh lebih besar dari yang diperlukan (mis. Memori yang dikonsumsi hanya dengan konfigurasi).


Secara teori, Anda dapat menghitung berapa banyak file-deskriptor yang dapat ditangani sistem Anda berdasarkan memori yang tersedia dan pernyataan bahwa setiap fd menggunakan 1K memori: serverfault.com/questions/330795/…
Alastair McCormack

Jawaban:


10

Saya menduga alasan utama untuk batasan ini adalah untuk menghindari konsumsi memori berlebih (setiap deskriptor file terbuka menggunakan memori kernel). Ini juga berfungsi sebagai perlindungan terhadap aplikasi buggy yang membocorkan deskriptor file dan menghabiskan sumber daya sistem.

Tetapi mengingat betapa banyak kepalang RAM sistem modern dibandingkan dengan sistem 10 tahun yang lalu, saya pikir standar saat ini cukup rendah.

Pada tahun 2011 batas keras default untuk deskriptor file di Linux meningkat dari 1024 menjadi 4096 .

Beberapa perangkat lunak (misalnya MongoDB) menggunakan lebih banyak deskriptor file daripada batas default. Orang-orang MongoDB merekomendasikan menaikkan batas ini menjadi 64.000 . Saya telah menggunakan rlimit_nofile300.000 untuk aplikasi tertentu.

Selama Anda mempertahankan batas lunak di default (1024), mungkin cukup aman untuk meningkatkan batas keras. Program harus memanggil setrlimit()untuk meningkatkan batas mereka di atas batas lunak, dan masih dibatasi oleh batas keras.

Lihat juga beberapa pertanyaan terkait:


6
Namun, ini sebenarnya tidak menjawab pertanyaan, yang menanyakan apakah ada batasan teknis atau praktis hingga seberapa tinggi seseorang dapat menetapkan batas keras . Memang ada, tetapi jawaban ini tidak menyebutkannya sama sekali.
JdeBP

Saya menemukan tidak mungkin untuk meningkatkan batas melampaui sekitar 1 juta. Saya pikir itu mungkin hard-coded di kernel, karena meskipun mengubah banyak konfigurasi, saya tidak dapat meningkatkan lebih dari ini. superuser.com/questions/1468436/…
Pavel Komarov

3

Dampaknya biasanya tidak dapat diamati, tetapi modul IO kernel harus mengurus semua deskriptor file yang terbuka dan mereka juga dapat berdampak pada efisiensi cache.

Batas tersebut memiliki keuntungan melindungi pengguna dari kesalahan mereka sendiri (atau pihak ketiga). Misalnya, jika Anda menjalankan sebuah program kecil atau skrip yang bercabang tanpa batas, program itu pada akhirnya akan memblokir salah satu dari ulimits dan karenanya mencegah pembekuan komputer yang lebih intens (mungkin tidak dapat dipulihkan).

Kecuali Anda memiliki alasan yang tepat untuk meningkatkan batasan tersebut, Anda harus menghindarinya dan tidur lebih nyenyak.


2

Secara teknis terbatas pada nilai maksimum unsigned long (C Lang) yaitu 4.294.967.295

Referensi: fs.hfile

/* And dynamically-tunable limits and defaults: */
struct files_stat_struct {
  unsigned long nr_files;   /* read only */
  unsigned long nr_free_files;  /* read only */
  unsigned long max_files;    /* tunable THIS IS OUR VALUE */
};

2
Apakah Anda punya referensi untuk ini?
Tim

Juga itu nilai maksimum untuk integer bertanda 32-bit, nilai maksimum integer 32-bit adalah 4.294.967.295.
Sampo

Anda benar, Sampo. Kesalahanku.
Leonard T

0

Saya pikir kekhawatiran Anda dapat dimengerti tetapi kemungkinan besar Linux tidak akan mengkonsumsi banyak memori untuk dikonfigurasi (tetapi tidak menggunakan deskriptor file) :)

Saya tidak dapat mengingat masalah seperti itu dalam karier profesional saya selama 10 tahun terakhir.

Salam.


0

Tenang, tetapi ini akan membantu orang lain untuk mendapatkan jawaban untuk pertanyaan ini. Batas praktis untuk jumlah file yang terbuka di linux juga dapat dihitung menggunakan jumlah maksimum deskriptor file yang dapat dibuka oleh suatu proses.

Saya telah melihat batasan diubah dari sistem ke sistem. Dari halaman manual getlimit Anda dapat melihat yang RLIMIT_NOFILE-1menentukan batas secara internal.

Untuk memeriksa nilai RLIMIT_NOFILE Anda dapat menggunakan pernyataan di bawah ini untuk mendapatkan tuple

python -c "import resource; print(resource.getrlimit(resource.RLIMIT_NOFILE))"

Tuple mengembalikan hasil sebagai (Soflimit, hardlimit). Bagi saya berjalan di beberapa sistem, hasilnya seperti di bawah ini

(1024, 1048576) # on UBUNTU linux 
(65536, 65536)  # on amazon linux 
(1024, 9223372036854775807) # on macos 

Catatan: 9223372036854775807 angka ini berarti tak terhingga. Anda akan selalu mencapai batas sumber daya lainnya sebelum Anda mencapai ini. Jika Anda telah memodifikasi hardlimit pada sistem di luar apa itu, Anda harus memodifikasi params kernel.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.