ලිනක්ස් හි විවෘත ලිපිගොනු ගණන සීමා වන්නේ ඇයි?


144

දැන්, මම දන්නවා කොහොමද කියලා:

  • එක් ක්‍රියාවලියකට විවෘත ගොනු සීමාව සොයා ගන්න: ulimit -n
  • සියලු ක්‍රියාවලීන් මඟින් විවෘත කරන ලද සියලුම ගොනු ගණන් කරන්න: lsof | wc -l
  • අවසර ලත් විවෘත ගොනු ගණන ලබා ගන්න: cat /proc/sys/fs/file-max

මගේ ප්‍රශ්නය: ලිනක්ස් හි විවෘත ලිපිගොනු සීමාවක් ඇත්තේ ඇයි?


3
Ob රොබ් ගූගල් කර එය දෙබලක බෝම්බයක් බව සොයා ගත් විට එය විවෘත ගොනු සීමාව පැහැදිලි කිරීමට භාවිතා කළ හැකිද?
xanpeng

7
හොඳයි, ක්‍රියාවලි සීමාවන් සහ ගොනු සීමාවන් වැදගත් වන බැවින් දෙබලක බෝම්බ වැනි දේවල් සියලුම පරිශීලකයින් සඳහා සේවාදායකයක් / පරිගණකයක් බිඳ නොදමනු ඇත, එය කරන පරිශීලකයා පමණක් සහ තාවකාලිකව පමණි. එසේ නොමැතිනම්, හවුල් සේවාදායකයක සිටින කෙනෙකුට ෆෝක්බෝම්බයක් සකසා එය තමන් පමණක් නොව සියලු පරිශීලකයින් සඳහා සම්පූර්ණයෙන්ම තට්ටු කළ හැකිය.
රොබ්

3
ඉතා ප්‍රයෝජනවත් විධානයන් සාරාංශ කිරීම සතුටක්! : +1:
ජෝෂුවා පින්ටර්

7
Ob රොබ්, දෙබලක බෝම්බයකට කිසිදු සම්බන්ධයක් නැත, මන්ද ගොනු ක්‍රියාවලිය එක් ක්‍රියාවලියක් වන අතර ඔබ දෙබලක සිටින සෑම අවස්ථාවකම එය නව ගොනු හසුරුව විවෘත නොකරයි.
psusi

Answers:


91

හේතුව, එක් එක් විවෘත ගොනුව කළමනාකරණය කිරීමට මෙහෙයුම් පද්ධතියට මතකය අවශ්‍ය වන අතර මතකය සීමිත සම්පතක් - විශේෂයෙන් කාවැද්දූ පද්ධති මත.

මූල පරිශීලකයා ලෙස ඔබට එක් ක්‍රියාවලියකට (හරහා ulimit -n) සහ පද්ධතියකට (උදා echo 800000 > /proc/sys/fs/file-max) විවෘත ගොනු ගණන උපරිම ලෙස වෙනස් කළ හැකිය .


21
ආරක්ෂක හේතුවක් ද තිබේ: සීමාවන් නොතිබුනේ නම්, පරිශීලක භූමි මෘදුකාංගයකට සේවාදායකය ක්‍රියා විරහිත වන තෙක් නිමක් නැතිව ගොනු නිර්මාණය කළ හැකිය.
කොරන්

18
OreCoren මෙහි සාකච්ඡා කර ඇති සීමාවන් විවෘත ගොනු හසුරුවන්නන් සඳහා පමණි. වැඩසටහනකට ගොනු හසුරුවන්නන් වසා දැමිය හැකි බැවින්, පවතින සියලුම තැටි අවකාශය පිරී යන තුරු එයට අවශ්‍ය තරම් ගොනු සහ අවශ්‍ය තරම් විශාල ප්‍රමාණයක් නිර්මාණය කළ හැකිය. මෙය වලක්වා ගැනීම සඳහා, ඔබට තැටි කෝටා හෝ වෙන් කළ කොටස් භාවිතා කළ හැකිය. ආරක්‍ෂාවේ එක් අංගයක් වන්නේ සම්පත් වෙහෙසට පත්වීම වැළැක්වීම බව ඔබ අර්ථයෙන් සත්‍යයකි - මේ සඳහා සීමාවන් තිබේ.
jofel

1
@ ජොෆෙල් ස්තූතියි. විවෘත ගොනු හැසිරවීම් ව්‍යුහාත්මක ගොනුවේ අවස්ථා මගින් නිරූපණය වන බව මම අනුමාන කරමි , මෙම ව්‍යුහයේ ප්‍රමාණය තරමක් කුඩා වේ (බයිට් මට්ටම), එබැවින් /.../file-maxමතකය භාවිතා නොකරන තාක් කල් මට විශාල අගයක් සැකසිය හැකිද?
xanpeng

7
anxanpeng මම කර්නල් විශේෂ expert යෙක් නොවෙමි, නමුත් මට පෙනෙන පරිදි, පෙරනිමිය file-maxRAM ප්‍රමාණය 10k වලින් බෙදනු ලැබේ. ලිපිගොනු හසුරුවන්නෙකු සඳහා භාවිතා කරන තාත්වික මතකය වඩා කුඩා විය යුතුය (ප්‍රමාණය struct fileසහ සමහර ධාවක මතකය මතකය), මෙය තරමක් සාම්ප්‍රදායික සීමාවක් ලෙස පෙනේ.
jofel

67

lsof | wc -lඅනුපිටපත් විශාල ප්‍රමාණයක් සාරාංශ කරන බව කරුණාවෙන් සලකන්න (දෙබලක ක්‍රියාවලියට ගොනු හැසිරවීම් ආදිය බෙදා ගත හැකිය). එම සංඛ්‍යාව නියම කර ඇති සීමාවට වඩා වැඩි විය හැකිය /proc/sys/fs/file-max.

ලිනක්ස් කර්නලයේ දෘෂ්ටි කෝණයෙන් වර්තමාන විවෘත ගොනු ගණන ලබා ගැනීම සඳහා මෙය කරන්න:

cat /proc/sys/fs/file-nr

උදාහරණය: මෙම සේවාදායකයේ උපරිම ලිපිගොනු 65536 න් 40096 ක් ඇත, නමුත් ඊට වඩා විශාල සංඛ්‍යාවක් වාර්තා කරයි:

# cat /proc/sys/fs/file-max
65536
# cat /proc/sys/fs/file-nr 
40096   0       65536
# lsof | wc -l
521504

1
ලෙස lsofදෙවරක් වැනි බොහෝ ගොනු වාර්තා කිරීමට හෝ වැඩි වනු ඇත, /dev/nullඔබ සමඟ හොදම අනුමානය කරන්න:lsof|awk '{print $9}'|sort|uniq|wc -l
Yvan

lsof|awk '!a[$NF]++{c++}END{print c}'විවෘත ලිපිගොනු වල අනුපිටපත් නොවන ගණන ලබා ගැනීමට ඔබට භාවිතා කළ හැකිය.
පී ....

18

මම හිතන්නේ එය බොහෝ දුරට historical තිහාසික හේතූන් මත ය.

ඒ Unix ගොනු descriptor යනු කුඩා intවැනි කාර්යයන් විසින් ලබා වටිනාකම, openසහ creat, හා සම්මත read, write, close, හා නැති නිසා.

අවම වශයෙන් යුනික්ස් හි මුල් සංස්කරණ වලදී, ලිපිගොනු විස්තර කරන්නෙකු යනු එක් එක් ව්‍යුහයට විවෘත ගොනුවක් පිළිබඳ තොරතුරු අඩංගු ස්ථාවර ප්‍රමාණයේ ව්‍යුහයන් සඳහා වූ දර්ශකයකි. මා නිවැරදිව සිහිපත් කළහොත්, සමහර මුල් පද්ධති මෙම වගුවේ ප්‍රමාණය 20 හෝ ඊට සීමා කළේය.

බොහෝ නවීන පද්ධතිවලට ඉහළ සීමාවන් ඇත, නමුත් එකම පොදු යෝජනා ක්‍රමය බොහෝ දුරට අවස්ථිතිභාවයෙන් බැහැරව පවතී.


1
20 යනු සී භාෂා FILE දත්ත ව්‍යුහයන් සඳහා සොලාරිස් සීමාවයි. ගොනු හැසිරවීමේ ගණන සෑම විටම විශාල විය.
ලොතාර්

Ot ලොතර්: සිත්ගන්නා සුළුය. සීමාවන් වෙනස් වන්නේ මන්දැයි මම කල්පනා කරමි. filenoසහ fdopenකාර්යයන් අනුව, ඒවා එකිනෙකට හුවමාරු විය හැකි යැයි මම බලාපොරොත්තු වෙමි.
කීත් තොම්සන්

යුනික්ස් ගොනුවක් යනු ගොනු හසුරුව (int) ආපසු ලබා දීමට වඩා වැඩි ය. තැටි බෆර සහ වත්මන් ගොනු ඕෆ්සෙට්, ගොනු හිමිකරු, අවසර,
ඉනෝඩ්

H චක්කොට්රිල්: ඔව්, ඇත්තෙන්ම. නමුත් එම තොරතුරු බොහොමයක් ගබඩා කර තැබිය යුත්තේ ගොනුවක් විස්තර කරුවෙකු හරහා intහෝ a FILE*. ඔබ සතුව ලිපිගොනු 20 කට වඩා තිබේ නම් open()එය fdopen()අසාර්ථක වේද?
කීත් තොම්සන්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.