লিনাক্স ফাইল সিস্টেম ক্যাশে থেকে একটি নির্দিষ্ট ফাইল ফেলে দিন?


23

আমি জানি যে আমি লিনাক্স ফাইল সিস্টেম ক্যাশে থেকে সমস্ত কিছু ফেলে দিতে পারি , তবে কেবল একটি নির্দিষ্ট ফাইল বাদ দেওয়ার কোনও উপায় আছে কি? বা কোনও ফাইলকে ক্যাশে হওয়া থেকে বিরত করবেন? অথবা কোনও প্রক্রিয়া বলুন যে কোনও ফাইল এটি লেখায় ক্যাশে না করে?

আমার একটি প্রক্রিয়া রয়েছে যা প্রচুর পরিমাণে ছোট্ট ফাইল পড়ে এবং একটি বড় ফাইল লেখায়। ডিস্ক সিক্স এড়ানোর জন্য আমি ছোট ফাইলগুলিকে ক্যাশে রাখতে চাই এবং বড় ফাইলটি ক্যাশে করার বিষয়ে আমার কোন চিন্তা নেই।


1
অনুগ্রহ সম্পর্কে, আমি শিরোনাম প্রশ্নে বিশেষভাবে আগ্রহী: ক্যাশে থেকে একটি নির্দিষ্ট ফাইল বাদ দেওয়া (এটি প্রথম স্থানে পৌঁছানো থেকে বিরত হিসাবে)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


21

সম্ভাব্য পদ্ধতি # 1 - F_DROP_CACHES

আমি ২০১২ সাল থেকে একটি পদ্ধতি খুঁজে পেয়েছি যা এই মেল থ্রেডে লিনাক্স কার্নেলের প্রস্তাবিত প্যাচটি নিয়ে শিরোনাম রয়েছে: পুনরায়: [আরএফসি প্যাচ] fs: প্রতি-ফাইল ড্রপ ক্যাশে প্রয়োগ করুন

উদ্ধৃতাংশ

কংগ> এটি প্রতি-ফাইল ড্রপ ক্যাশে প্রয়োগের একটি খসড়া প্যাচ।

মজাদার. সুতরাং আমি কি কোনও প্রক্রিয়া বাইরে থেকে এটি করতে পারি? আমি একজন সিসএডমিন, সুতরাং আমার পিওভ সিস্টেমটি যখন চাপে থাকে তখন পারফরম্যান্সের সমস্যাগুলি লক্ষ্য করা, সন্ধান এবং ফিক্সিং থেকে আসে।

Cong> It introduces a new fcntl command  F_DROP_CACHES to drop  
Cong> file caches of a specific file. The reason is that currently  
Cong> we only have a system-wide drop caches interface, it could  
Cong> cause system-wide performance down if we drop all page caches  
Cong> when we actually want to drop the caches of some huge file.

আমি কীভাবে বলতে পারি যে কোনও ফাইল কত ক্যাশে ব্যবহার করে? এবং একটি ব্যস্ত সিস্টেমে চালানোর সময় এর পারফরম্যান্স প্রভাব কী? সিস্টেমটি মেমরি চাপের মধ্যে আসার সাথে সাথে ভিএম ইতিমধ্যে ক্যাশে ফেলে দিচ্ছে বলে এই প্যাচটি আমাদের কী কিনে ...

কংগ্রেস> নীচে এই প্যাচটির জন্য ছোট পরীক্ষার মামলা রয়েছে:

থ্রেডে একটি টেস্টকেস এবং প্রকৃত প্যাচ উভয়ই লিনাক্স কার্নেলের মধ্যে থাকা বেশ কয়েকটি ফাইলে অন্তর্ভুক্ত রয়েছে যা fs/drop_caches.cডাকে অতিরিক্ত ফাংশন যুক্ত করে drop_pagecache_file(struct file *filp)। এই ফাংশনটি হ'ল fnctl.cকমান্ডের মাধ্যমে ফ্রন্টএন্ড সরঞ্জাম দ্বারা অ্যাক্সেসযোগ্য F_DROP_CACHES। এই কেসটি এই ফাংশনটিকে কল করে:

file_drop_caches(filp, arg);

যা প্রদত্ত ফাইলের সাথে সম্পর্কিত সমস্ত ক্যাশে ফেলে দেওয়ার বিষয়টি পরিচালনা করে। ফাইল থেকে include/linux/mm.h:

void file_drop_caches(struct file *filp, unsigned long which);
সুতরাং এই ব্যবহার করা যেতে পারে?

আমি কোনও প্রমাণ পাইনি যে এই প্যাচটি কখনও লিনাক্স কার্নেল কোড সংগ্রহস্থলটিতে প্রবেশ করেছে, সুতরাং আপনি লিনাক্স কার্নেলটি পুনরায় সংকলন করতে ইচ্ছুক হলে এই বিকল্পটি উপলব্ধ হবে to

সম্ভাব্য পদ্ধতি # 2 - ডিডি ব্যবহার করে

একই থ্রেডে, অন্য একজন ব্যবহারকারী একটি সম্পূর্ণ ভিন্ন পদ্ধতি উল্লেখ করেছেন যা ব্যবহার করে dd

নিম্নলিখিতটি ইমেলটি থেকে উদ্ধৃত হয়েছে

এটি কার্যকর কার্যকারিতা। যদিও এটি ইতিমধ্যে সরবরাহ করা হয়নি POSIX_FADV_DONTNEED? এই কার্যকারিতাটি এক বছর আগে GNU dd (8.11) এ যুক্ত হয়েছিল ।

এই প্যাচ থেকে উদাহরণ এখানে:
  • পুরো ফাইলের জন্য ক্যাশে ফেলে দেওয়ার পরামর্শ দিন

     $ dd if=ifile iflag=nocache count=0
    
  • পুরো ফাইলটির জন্য ড্রপ ক্যাশে নিশ্চিত করুন

     $ dd of=ofile oflag=nocache conv=notrunc,fdatasync count=0
    
  • ফাইলের অংশের জন্য ক্যাশে ফেলে দিন

     $ dd if=ifile iflag=nocache skip=10 count=10 of=/dev/null
    
  • কেবল পঠন-সামনের ক্যাশে ব্যবহার করে ডেটা স্ট্রিম করুন

     $ dd if=ifile of=ofile iflag=nocache oflag=nocache
    
এটি পরীক্ষা করে দেখছি

এটি কীভাবে পরীক্ষা করা যায় আমি 100% ইতিবাচক ছিলাম না তবে আমি নিম্নলিখিত পদ্ধতির সাথে উপস্থিত হয়েছি।

  1. একটি 100MB ফাইল তৈরি করুন

    $ dd if=/dev/urandom of=sample.txt bs=100M count=1
    
  2. ট্রেস ফাইল অ্যাক্সেস ব্যবহার করে fatrace

    $ sudo fatrace | grep sample.txt
    
  3. চালান topযাতে আমরা মেমরির ব্যবহার নিরীক্ষণ করতে পারি, নোটের পরিমাণ বিনামূল্যে।

    $ top
    
  4. ফাইল খুলুন, নোট মুক্ত ফ্রি মেমরি। fatraceফাইলটির নোট করুন sample.txt

    $ cat sample.txt > /dev/null
    
  5. মেমরি থেকে ফাইলটি ছেড়ে দিন, এখন ফ্রি মেমরির পরিমাণ নোট করুন। এর আউটপুট নোট করুন fatrace

    $ sudo dd of=/home/saml/tst/162600/sample.txt \
        oflag=nocache conv=notrunc,fdatasync count=0
    

উদাহরণ

টার্মিনালে # 1:
$ dd if=/dev/urandom of=sample.txt bs=100M count=1
1+0 records in
1+0 records out
104857600 bytes (105 MB) copied, 7.37996 s, 14.2 MB/s

$ ls -l sample.txt 
-rw-rw-r--. 1 saml saml 104857600 Oct 17 22:54 sample.txt
টার্মিনালে # 2:
$ top
...
KiB Mem:   7968336 total,  6900956 used,  1067380 free,   267080 buffers
...
টার্মিনালে # 3:
$ sudo fatrace | grep sample.txt
এখন ফাইলটি খুলুন sample.txt, এবং র‌্যামের পরিমাণটি নোট করুন। টার্মিনালে # 1।
$ cat sample.txt > /dev/null
টার্মিনালে # 2:
KiB Mem:   7968336 total,  7011896 used,   956440 free,   267336 buffers
fatraceটার্মিনাল # 3 এর আউটপুট লক্ষ্য করুন :
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): R /home/saml/tst/162600/sample.txt
cat(25940): RC /home/saml/tst/162600/sample.txt
# 4 টার্মিনালে র‌্যাম থেকে ফাইলটি সরান:
$ sudo dd of=/home/saml/tst/162600/sample.txt \
    oflag=nocache conv=notrunc,fdatasync count=0
fatraceটার্মিনাল # 2 এর আউটপুট নোট করুন :
dd(26229): O /home/saml/tst/162600/sample.txt
dd(26229): CW /home/saml/tst/162600/sample.txt
টার্মিনাল # 3 এ র‌্যাম নোট করুন:
KiB Mem:   7968336 total,  6908364 used,  1059972 free,   267364 buffers

সুতরাং দেখে মনে হবে যে র‌্যামের ফাইলটি যা খেয়েছিল সেগুলি সমস্তই মুক্তি পেয়েছে।

সম্ভাব্য পদ্ধতি # 3 - পাইথন-ফ্যাডভিস

@ ফ্রস্টচুটজ-এর একটি মন্তব্যে ধন্যবাদ, আরও একটি সরঞ্জাম রয়েছে, পাইথন স্ক্রিপ্ট, নাম দেওয়া হয়েছে [pyadvise][4]যা উপরের ddপদ্ধতির তুলনায় অনেক সহজ ইন্টারফেস সরবরাহ করে। এই স্ক্রিপ্ট একই posix_fadvise(2)ইন্টারফেস ব্যবহার করে ।

উদাহরণ
$ sudo pyadvise --help
Usage: 
    pyadvise [options] [FILE]..

Options:
  -h, --help        show this help message and exit
  -w, --willneed    The specified files will be accessed in the near future
  -s, --sequential  The application expects to access the specified files
                    sequentially (with lower offsets read before higher ones)
  -d, --dontneed    The specified files will not be accessed in the near
                    future
  -r, --random      The specified files will be accessed in random order
  -o, --noreuse     The specified files will be accessed only once. Under
                    Linux, this operation is a no-op; see contrib/copyfileobj-
                    fadvise.py in the python-fadvise source tree for an
                    example on how to achieve approximately the same effect
  -n, --normal      Indicates that the application has no advice to give about
                    its access pattern for the specified files. If no advice
                    is given for an open file, this is the default assumption
  -v, --verbose     Explain what is being done

এবং যদি আমরা উপরের পরীক্ষার পুনরাবৃত্তি করি এবং pyadviseএর স্থানে ব্যবহার করি dd:

$ pyadvise -d /home/saml/tst/162600/sample.txt

আমি যখন ব্যবহার করেছি তখন আগের মতো র‌্যামের অভিন্ন ড্রপটি গ্রাস করা লক্ষ্য করেছি dd


ddআমার জন্য কাজ কর. আমি chris-lamb.co.uk/projects/python-fadvise দিয়ে শেষ করেছি যা আরও স্পষ্ট কমান্ডে একই জিনিস।
frostschutz

@ ফ্রসচুটজ - খুব দুর্দান্ত। গিলস জিজ্ঞাসা না করা পর্যন্ত আমি এর আগে শুনিনি যে কেউ আড্ডায় কীভাবে এটি করতে হয় তা জানেন কিনা। python-fadviseঅনেক সহজ, আমি একটি উদাহরণ দেখিয়ে যুক্ত করেছি dd
slm

পাইথন স্ক্রিপ্টের লিঙ্কটি প্রশ্নের মূল অংশে স্থানান্তরিত করা উচিত। মন্তব্যগুলি ট্রেস ছাড়াই অদৃশ্য হয়ে যেতে পারে। একটি সম্পাদনা ইতিহাসে এখনও খারাপ থাকবে। যা বলার পরেও, একটি গুগল অনুসন্ধান এটি সহজেই খুঁজে পায়, তাই কোনও বড় বিষয় নয়।
ফাহিম মিঠা

এমনকি এটি সুডো ছাড়াও কাজ করে বলে মনে হয়, সুতরাং যে কেউ ফাইল দেখতে পাবে (এমনকি লেখার অনুমতি ছাড়াই) এর ক্যাশে ফেলে দেওয়া যেতে পারে, এটি ... আকর্ষণীয়।
frostschutz

1
নেই os.posix_fadvise()পাইথন এর স্ট্যান্ডার্ড libray এখন।
কাওয়িং-চিউ

3

@ গাইকোসরের উত্তরটি প্রসারিত করে আপনি O_DIRECTএখানে এলডিপ্রেলএড এবং প্রোগ্রামটি ব্যবহার করে জোর করতে পারবেন : http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.html

এই কোডটি O_DIRECTসমস্ত ফাইলের জন্য জোর করে। তবে, আপনার মধ্যে কেবল আরও কিছু __do_wrap_openস্ট্রান্সক্যাম্প যুক্তি যুক্ত করা বেছে বেছে O_DIRECT প্রয়োগ করতে পারে।

দাবি অস্বীকার: আমি এটি পরীক্ষা করিনি।


2

আপনি O_DIRECTপতাকা সহ পৃথক ফাইলগুলি খুলতে পারেন (দেখুন man 2 open) - সেই মানচিত্রের নোট বিভাগটি মনোযোগ সহকারে পড়ুন এবং আপনারও প্রয়োজন / প্রয়োজন কিনা তা বিবেচনা করুন O_SYNC


1
ঠিক আছে, আমার প্রক্রিয়া cat, এবং আমি বরং এটি আবার লিখব না। :) আমি একটি কমান্ড-লাইন সরঞ্জাম বা একটি /proc/sysগিরির জন্য আশা ছিল ।
জে হ্যাকার

2
এর চেয়েও খারাপ, আমি সন্দেহ করি আপনার সত্যিকার অর্থে আপনি পুনর্নির্দেশটি ব্যবহার করছেন, সুতরাং আপনার প্রক্রিয়াটি শেল। openপতাকা থেকে আলাদা করে এটিকে নিয়ন্ত্রণ করার জন্য আমি প্রতি ফাইলের উপায় জানি না ; এটি করার জন্য আপনার অবশ্যই একটি প্রোগ্রাম লিখতে হবে। ( cat -uকেবল stdioবাফারিং অক্ষম করে , ওএস বাফারিংকেই অক্ষম করে ))
গিকোসৌর

-2

আপনি যদি কোনও ফাইলকে সর্বদা O_SYNC ব্যবহার করতে বাধ্য করতে চান তবে আপনি এটিকে বর্ধিত বৈশিষ্ট্যের সাথে চিহ্নিত করতে পারেন chattr +S $file:

ম্যান চ্যাটার:

'এস' অ্যাট্রিবিউট সেট সহ কোনও ফাইল সংশোধন করা হলে, পরিবর্তনগুলি ডিস্কে সিঙ্ক্রোনজ করে লেখা হয়; এটি ফাইলগুলির একটি উপসেটে প্রয়োগ করা 'সিঙ্ক' মাউন্ট বিকল্পের সমান।

O_SYNC ডিস্ক বাফারগুলিতে ডেটা + মেটাডেটা লিখতে বাধ্য করে, তবে এটি এখনও পৃষ্ঠার ক্যাশে অতিক্রম করে। O_DIRECT পৃষ্ঠা ক্যাশে বাইপাস করে।

তবে সচেতন থাকুন যে ও_ডিআরসিটি দিয়ে এটি খোলার পক্ষে পারফরম্যান্সের জন্য ক্ষতিকারক, যদি বড় ফাইলটি কেবল এটি যুক্ত করা হয় তবে পার্থক্যটি ছোট হতে পারে। তবে এটিকে এলোমেলো জায়গায় পুনরায় লেখার জন্য যদি বড় ফাইলটি সম্পাদনা করে তবে অ_ডিআরএইসিটি খুব কার্যকর হবে, এমনকি এটি ক্যাশে রাখার কারণে এটি ছোট ছোট কিছু পঠিত ফাইল ক্যাশে থেকে উচ্ছেদ হতে পারে তাও বিবেচনা করা উচিত।

আপনার যদি সমস্ত ছোট ফাইল রাখার জন্য মেষ থাকে তবে আপনি সমস্যাটি অন্য উপায়ে নিতে পারেন। ছোট ফাইলগুলি সর্বদা র‌্যামে থাকে তা নিশ্চিত করুন, তারপরে আমি তাদের টিএমপিএফ- তে অনুলিপি করার পরামর্শ দেব :

tmpfs কার্নেল অভ্যন্তরীণ ক্যাশে সমস্ত কিছু রাখে এবং এতে থাকা ফাইলগুলিকে সংযোজন করতে বৃদ্ধি এবং সঙ্কুচিত হয়


chattr +Sএটি একই জিনিস নয় O_DIRECT, এটি একই জিনিস O_SYNCO_DIRECTকারণ পড়া ক্যাশে না করা (যা এই তর্কের কি), এবং লিখেছেন বাফার করা হবে না, কোন গ্যারান্টি দিয়ে। O_SYNCকেবল বাফার না হওয়ার জন্যই লেখায়
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস আপনি ঠিক বলেছেন, আমি প্রশ্নটি পড়েছি এবং ডিস্কে ডেটা ফ্লাশিং সম্পর্কে ভেবেছিলাম যেমনটি আমি আগে করেছিলাম। এবং এই ক্ষেত্রে আরও একটি সূক্ষ্ম, তবে গুরুত্বপূর্ণ, O_DIRECT এবং O_SYNC এর মধ্যে পার্থক্য রয়েছে, O_DIRECT পৃষ্ঠা ক্যাশেটিকে বাইপাস করে, তবে O_SYNC নয়, এটি ডেটা (এবং মেটাডেটা) কে ডিস্কে ফ্লাশ করতে বাধ্য করে, তবে এটি পৃষ্ঠা ক্যাশে এবং এর মধ্য দিয়ে যায় স্পিডআপ রিডিং সেখানে রাখা হয়। আমার উত্তরে ও_সাইএনসির জন্য ও_ডিআইআরসিটি পরিবর্তন করা উচিত যেন এটি একটি ভুল প্রমাণের সাথে না থাকে?
জর্জি নেরান

এই প্রশ্নটি একটি বড় ফাইল রাখার বিষয়ে জিজ্ঞাসা করে যা এটি ক্যাশে থেকে বাইরে লেখা হয়েছিল। আমি মনে করি এটি ও_ডিআরসিটি দিয়ে খোলার কাজ সম্পাদনের জন্য ক্ষতিকর এবং বড় ফাইলটি যদি এটি যুক্ত করা হয় তবে পার্থক্যটি ছোট হতে পারে। তবে এটিকে এলোমেলো জায়গায় পুনর্বার লিখিত বড় ফাইলটি ও_ডিআরএইচটি সম্পাদনের ক্ষেত্রে খুব বড় আঘাত হবেন, এমনকি এটি ছোট ছোট পড়ার ফাইল থেকে ক্যাশ থেকে উচ্ছেদ হতে পারে এমন বিষয়টিও বিবেচনায় রেখে।
জর্জি নেরান

পরিবর্তন O_DIRECTকরার জন্য O_SYNCআপনার উত্তর অভ্যন্তরীণভাবে সামঞ্জস্যপূর্ণ করতে হবে, কিন্তু এখনও ভুল প্রশ্ন বিবেচনা।
গিলস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.