আমি ভাবছি কেন এনএফএস ভি 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
অতিরিক্তভাবে নেটওয়ার্ক ছেলেরা বলে যে সংযোগগুলিতে কোনও ট্র্যাফিক শেপিং বা ব্যান্ডউইথ সীমাবদ্ধ নেই।