CPUのInterruptが跳ね上がり音飛びする原因と解決策

このQ&Aのポイント
  • Windows7 64bitのLenovo G570で動画再生中にCPUのInterruptが跳ね上がり音が飛ぶ問題が発生しています。この問題はndis.sys NDIS6.20ドライバが原因であり、デバイスマネージャでAtheros AR8152/8158有線ドライバを無効にすることで解決する可能性があります。しかし、試した解決策で問題が解消しなかったため、追加の解決策が必要です。
  • LatencyMonの結果によると、HDAudBus.sysが最も長いISRルーチンの実行時間を持っており、hal.dllが最も長いISRルーチンの合計時間を持っています。また、ndis.sysが最も長いDPCルーチンの実行時間と合計時間を持っています。詳細な情報と解決策を提供してください。
  • vpnclient_x64.exeが最も高いページフォールトカウントを持っており、全体で57回のハードページフォールトが発生しています。ハードページフォールトの解決には読み込み時間がかかるため、CPUの使用率が高くなる可能性があります。この問題も解決策が必要です。
回答を見る
  • ベストアンサー

InterruptのCPUが跳ね上がり音飛びする

windows7 64bit home Lenovoノート G570(サポートにあるドライバは全て最新) 内蔵 CPU i5 2.3G、MEM4G+8G(テスト済み)、SSD520 240G、LANカードAdvanced-N6250+Wimax abgn 外付け 3.5インチ4台ケースをUSB、E2220HDをDVI、M570マウスを使用。(全て外しても変化なし) セキュリティ AVIRA、COMODOFW、SuperAntiSpyware(全て検査済み) 症状 ブラウザで動画を再生中、5分おきぐらいに動作が重くなって音が飛ぶ。 ProcessExplorerによると「Interrupt」がCPUを瞬間的に30~40%消費している。 何故か普段でも1.2%前後で、スレッドには何も表示されず。 LatencyMonで確認するとDPCにおいて「ndis.sys NDIS6.20ドライバ」が原因とのこと。 ndis.sysはwinsxsとsystem32で見つかる。デバイスマネージャでAtheros AR8152/8158有線ドライバが該当していたので無効。 LatencyMonの結果変わらず。アンインストールして再起動。 LatencyMonの結果変わらず。Lenovoサポートから最新ドライバを落としインストール。 LatencyMonの結果変わらず。アンインストールして再起動で打つ手がなくなりました。 該当情報を検索しても海外の掲示板が引っかかるのみです。 以下にLMの結果をコピペしますので、足りない情報と解決策を教えてください。 REPORTED ISRs _________________________________________________________________________________________________________ Interrupt service routines are routines installed by the OS and device drivers that execute in response to a hardware interrupt signal. Highest ISR routine execution time (µs): 121.915867 Driver with highest ISR routine execution time: HDAudBus.sys - High Definition Audio Bus Driver, Microsoft Corporation Highest reported total ISR routine time (%): 0.056097 Driver with highest ISR total time: hal.dll - Hardware Abstraction Layer DLL, Microsoft Corporation Total time spent in ISRs (%) 0.080449 ISR count (execution time <250 µs): 261401 ISR count (execution time 250-500 µs): 0 ISR count (execution time 500-999 µs): 0 ISR count (execution time 1000-1999 µs): 0 ISR count (execution time 2000-3999 µs): 0 ISR count (execution time >=4000 µs): 0 _________________________________________________________________________________________________________ REPORTED DPCs _________________________________________________________________________________________________________ DPC routines are part of the interrupt servicing dispatch mechanism and disable the possibility for a process to utilize the CPU while it is interrupted until the DPC has finished execution. Highest DPC routine execution time (µs): 163516.577594 Driver with highest DPC routine execution time: ndis.sys - NDIS 6.20 ドライバー, Microsoft Corporation Highest reported total DPC routine time (%): 0.751335 Driver with highest DPC total execution time: ndis.sys - NDIS 6.20 ドライバー, Microsoft Corporation Total time spent in DPCs (%) 1.289586 DPC count (execution time <250 µs): 1548954 DPC count (execution time 250-500 µs): 0 DPC count (execution time 500-999 µs): 4822 DPC count (execution time 1000-1999 µs): 114 DPC count (execution time 2000-3999 µs): 25 DPC count (execution time >=4000 µs): 0 _________________________________________________________________________________________________________ REPORTED HARD PAGEFAULTS _________________________________________________________________________________________________________ Hard pagefaults are events that get triggered by making use of virtual memory that is not resident in RAM but backed by a memory mapped file on disk. The process of resolving the hard pagefault requires reading in the memory from disk while the process is interrupted and blocked from execution. Process with highest pagefault count: vpnclient_x64.exe Total number of hard pagefaults 57 Hard pagefault count of hardest hit process: 38 Highest hard pagefault resolution time (µs): 50.428509 Total time spent in hard pagefaults (%): 0.000109 Number of processes hit: 5

  • ACHE
  • お礼率41% (52/125)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

こんにちは。 audiodg.exeというプロセスが悪さをしていないでしょうか?

参考URL:
https://www.google.co.jp/#q=audiodg.exe
ACHE
質問者

補足

回答ありがとうございます。 audiodg.exeですが使用・予約メモリが約20M、cpuも1%未満で特に暴れている印象はないです。 念のため明瞭化を無効化しましたが、結果はやはりndis.sysで編かありませんでした。

関連するQ&A

  • ndisドライバを使用して、無線LANアダブタを認識させたい

    ndisドライバを使うと、freebsdに対応していなくてもWindowsのドライバをそのまま使えるというので下記のように試したのですが、 # ndiscvt -s ar5211.sys -i SymRedir.inf -o ndis_driver_data.h segment false? というような、エラー? が出てきてしまいます。 .infの方のファイルが、正しいものか自信がありません。 これは、.infのファイルが正しくないからいけないのかと思っているのですが、どうなんでしょうか?(泣 .sysのファイルはあっていると思うのですが、.infのファイルがどこにあるのかいまいちわかりません。 教えてください。よろしくおねがいします。

  • コンピューターアーキテクチャーについて

    現在、大学院でコンピューターアーキテクチャーのクラスを取っています。中間試験で下記のような問題が出ました。 「コンピューターCは100MHZで動作します。各クラスのClock cycles Per Instruction(CPI)は次のようになります。 Instruction Class i CPIi Integer ALU 1 Branch 2 Load/Store 3 Floating-Point Operation 4 プログラムPは次のようなループをコンピューターCで起動されます。 Loop: L.D F0,0(R1) <- Load/Store ADD.D F0,F0,F0 <- Integer ALU S.D F0,0(R1) <- Load/Store DSUBI R1,R1,#8 <- Floating-Point Operation BNEZ R1,Loop <- Branch レジスタR1の初期値は2000です。 質問1)プログラム全体のTotal Execution Time(TET)を計算しなさい。 そして回答が実はあるのですが、 プログラム全体のClock cycles Per Instruction(CPI) = Total Sum of (Instruction比x各CPIi) = (1/5)x1 + (1/5)x2 + (2/5)x3 + (1/5)x4 = 2.6 Total Execution Time = (InstructionCount) x CPI / Clock Rate = 250x5x2.6/100x10^6 = 32.5us ここでInstructionCountが何故250x5と計算されるのかわかりません。 面倒な質問ですが、よろしくお願いします。

  • ATTiny13Aが省電力化できない

    ATTiny13Aでフォトカプラを一定時間ONにする回路を作成しましたが、省電力にできません。 仕様としては10分、30分、60分をジャンパー等で選択し、ボタンを押したら一定時間の間、フォトカプラをONにします。 また、途中で再度、割り込みがあっても時間の延長はしません。 LR44電池2個で1年以上、動けばと思っています。 コードも拙い上、回路図もまともに書けない初心者ですが、よろしくお願いいたします。 #include <avr/wdt.h> #include <avr/sleep.h> //LED_PIN #define LED_PIN (5) //interrupt pin #define ACC_IN (2) //Time_select #define TIME_PIN1 (0) #define TIME_PIN2 (4) #define TIME_PIN3 (1) volatile int sleep_flg=0; volatile int counter; int count_max=15;//4second * 15 = 60 second int wait_minutes=1;//wait_time (minutes) //arduino wakeup interrupt void wakeUp() { //wdt_reset(); //sleep end sleep_flg = 0; //counter reset counter = 0; } //watch dog timer setup void wdt_set() { wdt_reset(); cli(); MCUSR = 0; WDTCR |= 0b00011000; //WDCE WDE set WDTCR = 0b01000000 | 0b100000;//WDIE set |WDIF set scale 4 seconds sei(); } //watch dog timer unset void wdt_unset() { wdt_reset(); cli(); MCUSR = 0; WDTCR |= 0b00011000; //WDCE WDE set WDTCR = 0b00000000; //status clear sei(); } //watch dog timer call ISR(WDT_vect) { //wdt_reset(); if(sleep_flg == 1) { counter++; if( counter >= (count_max * wait_minutes)) { //sleep end sleep_flg = 0; //counter reset counter = 0; } } else { } } //status reset void init_status() { counter=0; } //sleep arduino void sleep() { wdt_set(); //watch dog timer set sleep_flg=1; //enable on sleep flag set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set sleep mode attachInterrupt(0,wakeUp, RISING); //set level interrupt while(sleep_flg){ noInterrupts(); //cli(); sleep_enable(); interrupts(); //seii(); sleep_cpu(); //cpu sleep sleep_disable(); byte adcsra_old = ADCSRA; //NEW ADCSRA = 0; //NEW ADCSRA = adcsra_old; //NEW } wdt_unset(); //watch dog timer unset detachInterrupt(0); //unset level interrupt } //set up void setup() { init_status(); pinMode(LED_PIN,OUTPUT); pinMode(ACC_IN, INPUT); pinMode(TIME_PIN1, INPUT); pinMode(TIME_PIN2, INPUT); pinMode(TIME_PIN3, INPUT); } //main loop void loop() { if(!digitalRead(ACC_IN)) { sleep(); //sleep if (digitalRead(0) == HIGH) { digitalWrite(5, HIGH); //delay(1800000); // Wait for 1800 second(s) uint16_t i; for (i = 0; i < 10*60; i++) { _delay_ms(1000); } digitalWrite(5, LOW); delay(1000); // Wait for 1 second(s) } else { if (digitalRead(4) < HIGH) { digitalWrite(5, HIGH); //delay(600000); // Wait for 600 second(s) uint16_t i; for (i = 0; i < 30*60; i++) { _delay_ms(1000); } digitalWrite(5, LOW); delay(1000); // Wait for 1 second(s) } else { if (digitalRead(1) < HIGH) { digitalWrite(5, HIGH); //delay(36000000000); // Wait for 3600 second(s) uint16_t i; for (i = 0; i < 60*60; i++) { _delay_ms(1000); } digitalWrite(5, LOW); delay(1000); // Wait for 1 second(s) } else { delay(1000); // Wait for 1 second(s) } } } sleep(); //sleep } }

  • H8 3052について

    マイコン、電気回路初心者です。 h8 3052で回転計を作製をしたいのですが・・・知識を貸していただきたいです マイコン初心者です。。。 h8 3052で回転計を作製をしたいのですが・・・知識を貸していただけたら幸いです。 回転数を算出の式として次を用いたいと思います(精度はあまり気にしないでください。。。) 回転数[rpm]=60[sec]/1回転に要する時間[sec] リードスイッチとマグネット4つを使い回転数を算出したいと思っています。 リードスイッチが4つカウントしたときの時間(1回転に要する時間)を上の式の分母(t)に入れ演算させたいです。 ITUのタイマー割り込みを使い分母の時間をカウントをしカウントが4のときt=0と考えてました。 しかし、カウントを迎えてもtは永遠に1ずつ足され続け0に戻りません。 プログラムの考え方が違うのでしょうか? 使用環境からロータリーエンコーダ、フォトトランジスタなどが使えません。 チャタリングについては、本からRC積分回路(0.1μFとVccに10KΩ)使い、そこからさらに74HC04通してつかっているのですが・・・見よう見まね状態です。 開発環境はHEWを使っています。 勉強不足だと思いますが、10日くらい悩んでいます。力を貸してください。よろしくお願いします。 僕が立てたプログラムは次の通りです。 vector 12 IRQ0 (リードスイッチ 立下りエッジで割り込み要求) __interrupt(vect=12) void INT_IRQ0(void) { count++; INTC.ISR.BIT.IRQ0F=0; } vector 28 IMIA1 __interrupt(vect=28) void INT_IMIA1(void) { ITU1.TSR.BIT.IMFA = 0; taco_interrput-=1; if(taco_interrput==0) { t++; } taco_interrput=1; } void main() {   set_imask_ccr(1); //割り込み禁止   INTC.ISCR.BIT.IRQ0SC=1; //タコメータ 入力立下りエッジで割り込み発生   INTC.IER.BIT.IRQ0E=1; //IRQ0割り込み許可(タコメータ)        ITU1.TCR.BIT.CCLR=1; //ITU1カウンタクリア要因  ITU1.TCR.BIT.TPSC=3; //ITU1 3.125MHz  ITU1.GRA=3125-1; //ITU1 3.125MHz/3125=1000Hz、周期1ms(0からカウントされるため必ず-1)  ITU1.TIER.BIT.IMIEA = 1; //ITU1 IMFAフラグによる割り込み許可  ITU.TSTR.BIT.STR1=1; //ITU1タイマスタート  taco_interpput=1; //ITU(imia)割り込み回数1 割り込み先で1に戻るので無限  while(1)  {   if(count==4)    {     time=t;     t=0;     count=0;     n=60[sec]/time;    }   if(count>4) //カウントが4より大きくなってしまったとき    {     t=0;    count=0;    }  } } (LCDのプログラムは長いので省きました) LCDの液晶を使い以下のことは確認をしています。 ・カウントが4を迎えたときカウントは0に戻っています。(IRQのカウントのことです) ・カウントを何回与えてもtが0に戻りません。なので演算されてないです。(tは永遠に1ずつ足され続けてます) 回転数の使う範囲は50~200rpmです。 tのカウントを0に戻す記述をどうしたいいのかよろしくお願いします。

  • HDDを新品に交換からブルースクリーンが頻発

    お世話になります。 ブルースクリーン解決方法が知りたいです。 1TのHDDをSeagateが不調になりWestarn Digitalに交換しました。 それ以降必ず数時間スリープから復帰するとフリーズしブルースクリーンになります。数十分だとフリーズしましせん。 MSサポートを拝見、Msahci.sysが必要な様なのでインストール済みを確認。 MSのサポートサイトによると「大容量のHDDだとスリープ状態または休止状態から再開する場合、SATA ハード ディスク ドライバーは 10 秒以内に準備ができるSATA ハード ディスクが必要です。ただし、大容量の SATA ハード ディスクを準備する場合には10 秒より長くかかることがあります。このような状況において、再開操作がタイムアウトになりました。」とありました。 環境: Windows7(64)、DELL Inspiron One 2320 Core5、HDD 1TB お手数ですがご教示願います。

  • 起動途中で毎回再起動

    昨日まで普通に使えていた自作PCが、起動途中に毎回再起動してしまうようになってしまいました。 原因切り分けのアドバイス下されば嬉しいです。 【状況】 下記環境で、常用のWinXP-Pro(D:)から起動すると、WinXP起動の進捗バーが表示されている途中の、 毎回同じところででHDDのアクセスが止まり、再起動してしまう。 緊急用WinXP-Pro(C:)からは普通に起動でき、全ドライブにチェックディスクを掛けても異常はなく、 NOD32の詳細スキャンでウィルスも検知されない。又、常用WinXP-Pro(D:)からセーフモードでは起動する。 ブートログの抜粋は下記。 Service Pack 3 9 26 2009 21:56:55.375 Loaded driver \WINDOWS\system32\ntoskrnl.exe Loaded driver \WINDOWS\system32\hal.dll          :(この間、load完了) Loaded driver Ntfs.sys Loaded driver NDIS.sys Loaded driver Mup.sys Did not load driver ACPI マルチプロセッサ PC Did not load driver オーディオ CODEC Did not load driver レガシ オーディオ ドライバ          :(以降、load失敗) 【環境】 M/B : TYAN S2865 "Tomcat K8E" BIOS 3.03 CPU : Atholon X2 4600+ MEM : DDR400(PC3200) 1GB*2 + 512kB*2 = 3GB VGA : ATI RADEON 4850 PCI-E SND : ONKYO SE-90PCI HDD : 以下の3台を搭載 (1) HGST PATA 400GB/7200rpm C: 90GB 緊急用 WinXP-Pro SP3 I: 290GB 旧データ倉庫 (2) HGST SATA 1TB/7200rpm D: 230GB 常用 WinXP-Pro SP3 E: 230GB ドライバ&アプリケーション1 F: 230GB アプリケーション2 G: 230GB データ1 (3) HGST SATA 1TB/7200rpm J: 230GB 将来 Win7 インストール用 H; 720GB データ2 DVD: Pioner PATA DVD-RW POW: Antec EarthWatts 650 EPS-12V (650W) 以上です。何かお気付きの点、ございますか? よろしくお願い致します。

  • clock()関数の誤差

    プログラムの実行時間の計測について質問させていただきます。 現在,実行時間の計測でclock()関数を使っているのですが誤差が出ます。 timeコマンド(と実際に時計で測った時間)では95分、clock()関数で測った プログラム全体の実行時間は1376秒(約23分)と誤差が出る状態にあります。 プログラムでclock()関数を使っているのはmain()だけです。 printf()内がおかしいのでしょうか? 詳しい方、回答よろしくおねがいします。 ↓プログラム #include<time.h> (中略) clock_t t1,t2,t3,t4; (中略) main() { struct zahyo P,Q; int a,b,prime,Ord,sec; scanf("%d",&a); (中略) printf("Q.y = "); scanf("%d",&Q.y); t1=clock(); Ord=OrdCal(P,a,prime); t2=clock(); printf("Ord = %d\n",Ord); printf("OrdCal:%f(s)\n",(double)(t2-t1)/CLOCKS_PER_SEC); t3=clock(); PohlingBsgs(P,Q,a,prime,Ord); sec=secretkey(); t4=clock(); printf("secretkey=%d\n",sec); printf("Decipher:%f(s)\n",(double)(t4-t3)/CLOCKS_PER_SEC); printf("Total :%f(s)\n",(double)(t4-t1)/CLOCKS_PER_SEC); } 実行結果 Ordcal:74.170000(s) Decipher:1302.722704(s) Total :1376.902104(s) real 94m33.445s user 94m30.900s sys 0m0.980s

  • CPU負荷時の音飛びについて

    普段、YOUTUBEやニコニコ動画、itunesなどを視聴、再生している時にはCPU使用率は5%程度に収まっているのですが、ブラウザのスクロールや新規タブを開くとき、また動画の視聴中に急に50%~70%に跳ね上がり、動画のラグと音飛びが発生します。 CPU使用率は急な山のように跳ね上がるだけで、また普段通りに戻ります。 そのような症状が5分~30分おきに発生します。 CPUに負荷が一瞬かかるだけでラグや音飛びが頻繁に起こるようではストレスが溜まってしまいます。いろいろ調べたのですが、スペック不足とは思えません。 サウンドカードの購入などで改善するのでしょうか?(動画もラグがあるので音の問題だけではないのかも) 購入はドスパラです。何が原因なのでしょうか? よろしくお願いします。 【スペック】 Windows 7 Home Premium 64bit CPU:Core i7-2600 (3.40GHz) メモリ:8GB DDR3 SDRAM(PC3-10600/4GBx2/デュアルチャネル) HDD:1TB GPU:GeForce GTX560 1GB マザボ:ASRock H67DE ドライバの更新などは一通り行いました。

  • 昨日と今日のカウンタについて ご指摘下さい

    昨日と今日のカウンタについて カウンターが1こずつではなく、4つとか5つとかずつ増えてしまいます。ですが、html内の <p>本日の数は<img src="./count.cgi?today">です</p> <p>昨日の数は<img src="./count.cgi?yeaday">です</p> を削除すると、ちゃんと1つずつカウントしていきます。(count.datの本日のカウント数もちゃんと1こずつ増えるのを確認しました。) プログラムの何処が間違っているのでしょうか?アドバイスをお願い申し上げます。 <<count.cgi>> #!C:\Perl\bin\perl # 昨日と今日のカウントの取得 $ENV{'TZ'} = "JST-9"; $mday = (localtime(time))[3]; open (FILE, "<logday.dat") || die "File Open Err!-logday.dat\n"; $logday = <FILE>; close(FILE); ($day, $yesday) = split(/:/, $logday); #それぞれ、今日の日付、昨日のカウント数に分ける open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; $count = <FILE>; #変数countにデータを収納 close(FILE); ($count, $today) = split(/:/, $count); #それぞれ、トータルカウント数、今日の日付のカウント数に分ける # 数をカウント if($day == $mday){ #同日だったなら、トータルと本日のカウントだけ取る。 &totalcount(); }else{ #違っていたら、本日のカウント数を昨日へ、本日のカウントを0に、日にちを修正 $yesday = $today; $today = 0; open (FILE, ">count.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$count\:$today"; flock(FILE,8); close(FILE); open (FILE, ">logday.dat") || die "File Open Err!-logday.dat\n"; flock(FILE,2); print FILE "$mday\:$yesday"; flock(FILE,8); close(FILE); &totalcount(); #その後カウントをとる } # 引数受取 $mode = $ENV{'QUERY_STRING'}; $mode =~ s/\W//g; require "./gifcat.pl"; #画像表示のif文================ if($mode eq "total"){ &total(); }elsif($mode eq "today"){ &today(); }else{ &yestaday();} exit; # ログの更新================================ sub totalcount{ open(FILE, "+<count.dat") || die "File Open Error!\n"; flock(FILE,2); $count++; #トータルカウント数にプラス1 $today++; #同じく本日のカウント数にもプラス1 seek(FILE, 0, 0); print FILE "$count\:$today"; flock(FILE,8); close(FILE); } # カウンタの数字に画像を付ける sub total{ #トータルカウンタ============= @countdata = split(//, $count); foreach $cou(@countdata){ push(@view, "./img-t/$cou.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view); } sub today{ #今日のカウンタ============= @countdatadt = split(//, $today); foreach $coudt(@countdatadt){ push(@viewdt, "./img-d/$coudt.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdt); } sub yestaday{ #今日のカウンタ============= @countdatady = split(//, $yesday); foreach $coudy(@countdatady){ push(@viewdy, "./img-d/$coudy.gif"); } #画像の出力=============== print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@viewdy); } <<count.html>> <html> <head> <title>カウンタ</title> </head> <body> <p>トータルカウント数は<img src="./count.cgi?total">です</p> <p>本日の数は<img src="./count.cgi?today">です</p> <p>昨日の数は<img src="./count.cgi?yeaday">です</p> </body> </html> <<count.dat>> トータル数:本日のカウント数 <<logday.dat>> 今日の日:昨日のカウント数

    • ベストアンサー
    • Perl
  • 玄箱DebianでNFSの転送速度が悲惨

    以下の環境でカーネルモードにてNFSサーバを稼動しています。 <NFSサーバ> ハードウェア: 玄箱HG PowerPC266MHz RAM256MB 1000Base-T/100Base-T/10Base-T対応NIC OS: Debian GNU/Linux 4.0 etch(PPC) Kernel 2.4.17 hostname:alice(IP:192.168.0.100) # /etc/fstab # <file system> <mount point> <type> <options> <dump> <pass> (省略) /dev/sda1 /mnt/sda1 vfat rw,utf8,uid=65534,gid=65534 0 0 /dev/sda2 /mnt/sda2 vfat rw,utf8,uid=65534,gid=65534 0 0 /dev/sdb1 /mnt/sdb1 ext3 rw 0 0 # /etc/exports /mnt/sda1 192.168.0.0/255.255.255.0(rw,async,no_subtree_check,all_squash) /mnt/sda2 192.168.0.0/255.255.255.0(rw,async,no_subtree_check,all_squash) /mnt/sdb1 192.168.0.0/255.255.255.0(rw,async,no_subtree_check,all_squash) ※sda、sdbはUSB2.0外付けハードディスクストレージ。 <クライアント> ハードウェア: NEC LavieLight Atom1.66GHz RAM2048GB 100BASE-TX/10BASE-T対応NIC OS: Ubuntu 9.10 Karmic (x86) Kernel 2.6 hostname:fox(IP:192.168.0.6) 備考: NFSマウントポイントとして、/mnt/sda1 /mnt/sda2 /mnt/sdb1がある。 NFSディレクトリのマウントは通常 # mount -t nfs -o rw,async 192.168.0.100:/mnt/sda1 /mnt/sda1 としています。 <ルータ> ハードウェア: IODATA ETX-R 10/100Mbps IP: 192.168.0.1 <NFSサーバ>のsda1やsda2の動画を<クライアント>からmplayerなどで再生しようとする ブチブチと途切れてしまい、最終的には再生が止まったまま反応がなくなります。 roxやシェルから、大きなファイルをコピーしようとしても同様に固まってしまう 状況でしたので、<NFSサーバ>と<クライアント>間の転送速度に問題があるんじゃないかと 思いました。 そこで以下のように<クライアント>からddする事で、速度を測ってみました。 root@fox:~# time dd if=/dev/zero of=/mnt/sda1/test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 0.609116 s, 8.6 MB/s real 0m0.643s user 0m0.004s sys 0m0.052s root@fox:~# time dd if=/mnt/sda1/test.img of=/dev/null bs=1024k count=5 3+0 records in 2+0 records out 2097152 bytes (2.1 MB) copied, 135.476 s, 15.5 kB/s real 2m15.486s user 0m0.004s sys 0m0.032s 5MBのファイルを上がwrite、下がreadしている結果ですが、書き込みに1秒半、 読み込みに2分以上もかかっています。いくら100BASEなLAN環境とは言え、 これでは使いものになりません。特にreadは何度測っても、残念な結果ばかりでした。 ※念の為、試行の度にumount->nfs-kernel-server restart->mountを行なっています。 NFSのチューニング記事を参考に、<クライアント>からのマウント時に いくつかのブロックサイズを指定して試してみても、ほとんど変化なしでした。 vfatが悪いのか、USBストレージが原因なのか、それとも・・・。 それを確認する為に、今度は<NFSサーバ>で以下のddを試しました。 root@alice:~# time dd if=/dev/zero of=/mnt/sda1/test.img bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 0.0839 seconds, 62.5 MB/s real 0m0.137s user 0m0.000s sys 0m0.140s root@alice:~# time dd if=/mnt/sda1/test.img of=/dev/null bs=1024k count=5 5+0 records in 5+0 records out 5242880 bytes (5.2 MB) copied, 0.053922 seconds, 97.2 MB/s real 0m0.079s user 0m0.000s sys 0m0.070s 上が5MBのwrite、下が5MBのreadです。 サンプルが5MBと少ないので、試験する度に値が変わりますが、 それでも数十MB毎秒と十分な速度が出ていました。 となるとやはり原因は、<NFSサーバ>の設定、<クライアント>のアクセスの仕方、 <ルータ>の3つに絞られてくると思います。 <ルータ>は同ネットワークの他マシンから、(NFSではない)ファイル送受信を 10MB毎秒近い速度を出しているので問題ないと思います。 <NFSサーバ>ではクリティカルに負荷になりそうなプロセスは常駐してません。 <クライアント>のdd結果は、他のUbuntuマシンから試行した際も似たような結果だったので、 問題ないと思います。 <NFSサーバ>の転送速度向上に心あたりがある方がいらっしゃいましたら、ご指導お願い致します。