Saat ini, saya tahu cara:
- temukan batas file terbuka per proses:
ulimit -n
- hitung semua file yang dibuka oleh semua proses:
lsof | wc -l
- dapatkan jumlah maksimum file terbuka yang dibolehkan:
cat /proc/sys/fs/file-max
Pertanyaan saya adalah: Mengapa ada batasan file terbuka di Linux?
open-files
limit
xanpeng
sumber
sumber
Jawaban:
Alasannya adalah bahwa sistem operasi membutuhkan memori untuk mengelola setiap file yang terbuka, dan memori adalah sumber daya yang terbatas - terutama pada sistem embedded.
Sebagai pengguna root, Anda dapat mengubah jumlah file terbuka maksimum per proses (via
ulimit -n
) dan per sistem (misalnyaecho 800000 > /proc/sys/fs/file-max
).sumber
/.../file-max
dengan nilai yang cukup besar selama memori tidak digunakan?file-max
tampaknya adalah ukuran RAM dibagi 10k. Karena memori sebenarnya yang digunakan per file handler harus jauh lebih kecil (ukuranstruct file
plus beberapa memori tergantung driver), ini tampaknya batas yang cukup konservatif.Harap dicatat bahwa
lsof | wc -l
meringkas banyak entri yang digandakan (proses bercabang dapat berbagi file menangani dll). Angka itu bisa jauh lebih tinggi dari batas yang ditetapkan/proc/sys/fs/file-max
.Untuk mendapatkan jumlah file terbuka saat ini dari sudut pandang kernel Linux, lakukan ini:
cat /proc/sys/fs/file-nr
Contoh: Server ini memiliki 40096 dari maks 65536 file terbuka, walaupun dilaporkan jumlah yang jauh lebih besar:
sumber
lsof
akan melaporkan banyak file dua kali atau lebih, seperti/dev/null
, Anda dapat mencoba tebak terbaik dengan:lsof|awk '{print $9}'|sort|uniq|wc -l
lsof|awk '!a[$NF]++{c++}END{print c}'
untuk mendapatkan jumlah file terbuka non-duplikat.Saya pikir ini sebagian besar karena alasan historis.
Sebuah file descriptor Unix adalah kecil
int
nilai, dikembalikan oleh fungsi sepertiopen
dancreat
, dan diteruskan keread
,write
,close
, dan sebagainya.Setidaknya dalam versi awal Unix, deskriptor file hanyalah sebuah indeks ke dalam array struktur ukuran-tetap per proses, di mana setiap struktur berisi informasi tentang file yang terbuka. Jika saya ingat dengan benar, beberapa sistem awal membatasi ukuran tabel ini hingga 20 atau lebih.
Lebih banyak sistem modern memiliki batas yang lebih tinggi, tetapi telah mempertahankan skema umum yang sama, sebagian besar di luar inersia.
sumber
fileno
danfdopen
fungsinya, saya berharap mereka hampir saling dipertukarkan.int
deskriptor atauFILE*
. Jika Anda memiliki lebih dari 20 file yang terbukaopen()
, apakah akanfdopen()
gagal?