এনএফএস ভি 3 বনাম ভি 4


11

আমি ভাবছি কেন এনএফএস ভি 4 এনএফএস ভি 3 এর তুলনায় এত দ্রুত হবে এবং যদি ভি 3-তে কোনও পরামিতি থাকে তবে এটি টুইট করা যেতে পারে।

আমি একটি ফাইল সিস্টেম মাউন্ট

sudo mount  -o  'rw,bg,hard,nointr,rsize=1048576,wsize=1048576,vers=4'  toto:/test /test

এবং তারপর চালান

 dd if=/test/file  of=/dev/null bs=1024k

আমি 200-400MB / গুলি পড়তে পারি তবে আমি যখন সংস্করণটি পরিবর্তন করি তখন ডিডিটিকেvers=3 পুনরায় মাউন্ট এবং পুনরায় চালিত করি আমি কেবল 90MB / s পাই । আমি যে ফাইলটি থেকে পড়ছি তা হ'ল এনএফএস সার্ভারের একটি মেমরি ফাইল। সংযোগের উভয় পক্ষই সোলারিস এবং 10 জিবিই এনআইসি রয়েছে। আমি সমস্ত পরীক্ষার মধ্যে পুনর্নির্মাণের মাধ্যমে কোনও ক্লায়েন্টের সাইড কেচিং এড়াতে চাই। আমি dtraceএনএফএসের মাধ্যমে কীভাবে ডেটা পরিবেশন করা হচ্ছে তা পরিমাপ করতে সার্ভারে দেখতে ব্যবহৃত হত । ভি 3 এবং ভি 4 উভয়ের জন্যই আমি পরিবর্তন করেছি:

 nfs4_bsize
 nfs3_bsize

ডিফল্ট 32 কে থেকে 1 এম (ভি 4-তে আমি 150 এমবি / সেকেন্ডে 32 কে দিয়েছি) আমি টুইট করার চেষ্টা করেছি

  • nfs3_max_threads
  • clnt_max_conns
  • nfs3_async_clusters

ভি 3 পারফরম্যান্স উন্নতি করতে, কিন্তু যেতে হবে না।

ভি 3-তে আমি যদি চারটি সমান্তরালভাবে চালিত করি তবে ddথ্রুপুটটি 90MB / s থেকে 70-80MB এর নিচে নেমে যায় যা আমাকে বিশ্বাস করে যে সমস্যাটি কিছু ভাগ করা সংস্থান এবং যদি তাই হয় তবে আমি ভাবছি এটি কী এবং আমি যদি এটি বাড়িয়ে দিতে পারি সম্পদ।

উইন্ডো মাপ পেতে dtrace কোড:

#!/usr/sbin/dtrace -s
#pragma D option quiet
#pragma D option defaultargs

inline string ADDR=$$1;

dtrace:::BEGIN
{
       TITLE = 10;
       title = 0;
       printf("starting up ...\n");
       self->start = 0;
}

tcp:::send, tcp:::receive
/   self->start == 0  /
{
     walltime[args[1]->cs_cid]= timestamp;
     self->start = 1;
}

tcp:::send, tcp:::receive
/   title == 0  &&
     ( ADDR == NULL || args[3]->tcps_raddr == ADDR  ) /
{
      printf("%4s %15s %6s %6s %6s %8s %8s %8s %8s %8s  %8s %8s %8s  %8s %8s\n",
        "cid",
        "ip",
        "usend"    ,
        "urecd" ,
        "delta"  ,
        "send"  ,
        "recd"  ,
        "ssz"  ,
        "sscal"  ,
        "rsz",
        "rscal",
        "congw",
        "conthr",
        "flags",
        "retran"
      );
      title = TITLE ;
}

tcp:::send
/     ( ADDR == NULL || args[3]->tcps_raddr == ADDR ) /
{
    nfs[args[1]->cs_cid]=1; /* this is an NFS thread */
    this->delta= timestamp-walltime[args[1]->cs_cid];
    walltime[args[1]->cs_cid]=timestamp;
    this->flags="";
    this->flags= strjoin((( args[4]->tcp_flags & TH_FIN ) ? "FIN|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_SYN ) ? "SYN|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_RST ) ? "RST|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_PUSH ) ? "PUSH|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_ACK ) ? "ACK|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_URG ) ? "URG|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_ECE ) ? "ECE|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_CWR ) ? "CWR|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags == 0 ) ? "null " : ""),this->flags);
    printf("%5d %14s %6d %6d %6d %8d \ %-8s %8d %6d %8d  %8d %8d %12d %s %d  \n",
        args[1]->cs_cid%1000,
        args[3]->tcps_raddr  ,
        args[3]->tcps_snxt - args[3]->tcps_suna ,
        args[3]->tcps_rnxt - args[3]->tcps_rack,
        this->delta/1000,
        args[2]->ip_plength - args[4]->tcp_offset,
        "",
        args[3]->tcps_swnd,
        args[3]->tcps_snd_ws,
        args[3]->tcps_rwnd,
        args[3]->tcps_rcv_ws,
        args[3]->tcps_cwnd,
        args[3]->tcps_cwnd_ssthresh,
        this->flags,
        args[3]->tcps_retransmit
      );
    this->flags=0;
    title--;
    this->delta=0;
}

tcp:::receive
/ nfs[args[1]->cs_cid] &&  ( ADDR == NULL || args[3]->tcps_raddr == ADDR ) /
{
    this->delta= timestamp-walltime[args[1]->cs_cid];
    walltime[args[1]->cs_cid]=timestamp;
    this->flags="";
    this->flags= strjoin((( args[4]->tcp_flags & TH_FIN ) ? "FIN|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_SYN ) ? "SYN|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_RST ) ? "RST|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_PUSH ) ? "PUSH|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_ACK ) ? "ACK|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_URG ) ? "URG|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_ECE ) ? "ECE|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags & TH_CWR ) ? "CWR|" : ""),this->flags);
    this->flags= strjoin((( args[4]->tcp_flags == 0 ) ? "null " : ""),this->flags);
    printf("%5d %14s %6d %6d %6d %8s / %-8d %8d %6d %8d  %8d %8d %12d %s %d  \n",
        args[1]->cs_cid%1000,
        args[3]->tcps_raddr  ,
        args[3]->tcps_snxt - args[3]->tcps_suna ,
        args[3]->tcps_rnxt - args[3]->tcps_rack,
        this->delta/1000,
        "",
        args[2]->ip_plength - args[4]->tcp_offset,
        args[3]->tcps_swnd,
        args[3]->tcps_snd_ws,
        args[3]->tcps_rwnd,
        args[3]->tcps_rcv_ws,
        args[3]->tcps_cwnd,
        args[3]->tcps_cwnd_ssthresh,
        this->flags,
        args[3]->tcps_retransmit
      );
    this->flags=0;
    title--;
    this->delta=0;
}

আউটপুট দেখে মনে হচ্ছে (এই বিশেষ পরিস্থিতি থেকে নয়):

cid              ip  usend  urecd  delta     send     recd      ssz    sscal      rsz     rscal    congw   conthr     flags   retran
  320 192.168.100.186    240      0    272      240 \             49232      0  1049800         5  1049800         2896 ACK|PUSH| 0
  320 192.168.100.186    240      0    196          / 68          49232      0  1049800         5  1049800         2896 ACK|PUSH| 0
  320 192.168.100.186      0      0  27445        0 \             49232      0  1049800         5  1049800         2896 ACK| 0
   24 192.168.100.177      0      0 255562          / 52          64060      0    64240         0    91980         2920 ACK|PUSH| 0
   24 192.168.100.177     52      0    301       52 \             64060      0    64240         0    91980         2920 ACK|PUSH| 0

কিছু শিরোনাম

usend - unacknowledged send bytes
urecd - unacknowledged received bytes
ssz - send window
rsz - receive window
congw - congestion window

ডিডি এর v3 এবং v4 এর স্নুপ নেওয়ার এবং তুলনা করার পরিকল্পনা করছেন। ইতিমধ্যে এটি সম্পন্ন হয়েছে তবে খুব বেশি ট্র্যাফিক ছিল এবং আমি ক্যাশেড ফাইলের পরিবর্তে একটি ডিস্ক ফাইল ব্যবহার করেছি যা সময়কে তুলনা করার সময়কে অর্থহীন করে তুলেছে। ক্যাশেড ডেটা এবং বাক্সগুলির মধ্যে অন্য কোনও ট্র্যাফিক সহ অন্যান্য স্নুপগুলি চালিত করবে। TBD

অতিরিক্তভাবে নেটওয়ার্ক ছেলেরা বলে যে সংযোগগুলিতে কোনও ট্র্যাফিক শেপিং বা ব্যান্ডউইথ সীমাবদ্ধ নেই।


2
ভাল একটি জিনিস জন্য nfsv4 udp পরিবর্তে ডিফল্ট দ্বারা tcp চালায়।
ফিল হলেনব্যাক

3
আফাইক, সোলারিস, লিনাক্সের বিপরীতে, v3-তে এমনকি ডিফল্টরূপে tcp লাগায়। ভি 3 পরীক্ষার জন্য আমি কিছু পরীক্ষায় স্পষ্টভাবে "প্রোটো = টিসিপি" দিয়েছিলাম তবে "প্রোটো = টিসিপি" সহ বা ছাড়াই ভি 3 তে একই পারফরম্যান্স পেয়েছিলাম
কাইল হেইলি

আপনি কি ইতিমধ্যে স্যুইচিং অবকাঠামো এবং সার্ভার এনআইসিতে জাম্বো ফ্রেমগুলি সক্ষম করেছেন?
বহুবর্ষ

হ্যাঁ, জাম্বো ফ্রেমগুলি সেট আপ হয়েছে এবং যাচাই করা হয়েছে। Dtrace এর সাহায্যে আমি প্যাকেটের আকার দেখতে পারি।
কাইল হেইলি

1
আসলে, লিনাক্স এছাড়াও tcp সঙ্গে মাউন্ট ডিফল্ট
janneb

উত্তর:


4

এনএফএস 4.1 (অপ্রাপ্ত বয়স্ক 1) একটি দ্রুত এবং আরও দক্ষ প্রোটোকল হিসাবে ডিজাইন করা হয়েছে এবং পূর্ববর্তী সংস্করণগুলিতে বিশেষত 4.0 এর চেয়ে বেশি প্রস্তাবিত।

এর মধ্যে রয়েছে ক্লায়েন্ট-সাইড ক্যাচিং , এবং যদিও এই দৃশ্যে প্রাসঙ্গিক নয়, সমান্তরাল-এনএফএস (পিএনএফএস) । প্রধান পরিবর্তনটি হ'ল প্রোটোকলটি এখন রাষ্ট্রীয়।

http://www.netapp.com/us/communities/tech-ontap/nfsv4-0408.html

আমি মনে করি নেট অ্যাপ্লিকেশনগুলি ব্যবহার করার সময় এটিগুলির প্রস্তাবিত প্রোটোকল, তাদের পারফরম্যান্স ডকুমেন্টেশন দ্বারা বিচার করা। প্রযুক্তিটি উইন্ডোজ ভিস্তা + সুবিধাবাদী লকিংয়ের মতো।

এনএফএসভি 4 এনএফএস-এর পূর্ববর্তী সংস্করণগুলির থেকে পৃথক, কোনও সার্ভারকে ক্লায়েন্টের কাছে ডেটা আরও আক্রমণাত্মক ক্লায়েন্ট ক্যাশে সক্ষম করার জন্য এবং লকিংয়ের স্থিতি ক্যাচিংয়ের অনুমতি দেওয়ার জন্য একটি ফাইলের নির্দিষ্ট ক্রিয়াগুলি অর্পণ করার মাধ্যমে। একটি সার্ভার একটি প্রতিনিধিদলের মাধ্যমে ক্লায়েন্টের কাছে ফাইল আপডেটের নিয়ন্ত্রণ এবং লকিং রাষ্ট্রের নিয়ন্ত্রণ দেয়। এটি ক্লায়েন্টকে স্থানীয়ভাবে বিভিন্ন ক্রিয়াকলাপ এবং ক্যাশে ডেটা সম্পাদনের অনুমতি দিয়ে বিলম্বিতা হ্রাস করে। প্রতিনিধি দুটি ধরণের বর্তমানে বিদ্যমান: পড়া এবং লিখুন। কোনও ফাইলের জন্য বিতর্ক থাকা উচিত যদি ক্লায়েন্টের কাছ থেকে একটি প্রতিনিধিদলকে ফেরত ডাকার ক্ষমতা সার্ভারের থাকে। একবার যখন কোনও ক্লায়েন্ট একটি প্রতিনিধি দল গ্রহণ করে, এটি ফাইলের ক্রিয়াকলাপ সম্পাদন করতে পারে যার ডেটা স্থানীয়ভাবে আটকানো এবং নেটওয়ার্ক I / O অপ্টিমাইজ করার জন্য স্থানীয়ভাবে ক্যাশে করা হয়েছে। প্রতিনিধিদলের ফলাফল হিসাবে আরও আক্রমণাত্মক ক্যাচিং নিম্নলিখিত বৈশিষ্ট্যগুলি সহ পরিবেশে একটি বড় সহায়তা হতে পারে:

  • ঘন ঘন খোলে এবং বন্ধ হয়
  • ঘন ঘন GETATTRs
  • ফাইল লক করা
  • কেবল পঠন ভাগ করে নেওয়া
  • উচ্চ বিলম্ব
  • দ্রুত ক্লায়েন্টদের
  • অনেক ক্লায়েন্ট সহ ভারী সার্ভার server

এনএফএস ৪.১-এর পয়েন্টারগুলির জন্য ধন্যবাদ যদিও আমি এএএফআইকি করেছি তারা আমরা ৪.০
কাইল হেইলি

1
প্রকৃতপক্ষে, ক্লায়েন্টের সাইড ক্যাচিং পরিবর্তনগুলি 4.0 এর সাথে এসেছে এবং লেখার জন্য সবচেয়ে বড় পারফরম্যান্স পার্থক্য হতে পারে, যেমন আপনি ভি 4 এক্সট্র্যাক্ট থেকে দেখতে পাবেন - "এনএফএসভি 4 ... প্রতিনিধি ... একজন ক্লায়েন্টকে"। সবেমাত্র লক্ষ্য করা প্রশ্নটি পড়া সম্পর্কে ছিল। আমি নিশ্চিত নই যে এর ক্ষেত্রে সর্বাধিক প্রাসঙ্গিক।
পিটার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.