
Ubuntu日本語フォーラム

ログインしていません。
shirakawaと申します.
ubuntu 10.04 LTS 日本語ローカライズサーバ版において,apache2 をインストールしたのですが,クライアントからある一定のサイズを超えるファイルをダウンロードすると,必ずファイルが壊れてダウンロードされてしまいます.2KBでは問題なくダウンロードできますが,3KBを超えるとファイルが壊れてしまいます.画像ファイルでは,画像を閲覧できない状態になりました.
サーバ機(自分自身)からのダウンロードは,どちらのファイルも問題なくダウンロードすることができます.
クライアントから wget で 2048byte のファイルをダウンロードすると
$ wget http://example.com/dat/2048byte.dat --2010-11-26 09:04:52-- http://example.com/dat/2048byte.dat example.com をDNSに問いあわせています... 192.168.xxx.yyy example.com|192.168.xxx.yyy|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 2048 (2.0K) [application/x-ns-proxy-autoconfig] `2048byte.dat' に保存中 100%[=============================================================================================================================>] 2,048 --.-K/s 時間 0s 2010-11-26 09:04:52 (62.0 MB/s) - `2048byte.dat' へ保存完了 [2048/2048]
と問題なくダウンロードできるのですが,3072byte のファイルをダウンロードすると
$ wget http://example.com/dat/3072byte.dat
--2010-11-26 09:05:13-- http://example/dat/3072byte.dat
example.com をDNSに問いあわせています... 192.168.xxx.yyy
example.com|192.168.xxx.yyy|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 ヘッダがないので、HTTP/0.9 だと仮定します
長さ: 特定できません
`3072byte.dat' に保存中
[ <=> ] 3,374 --.-K/s 時間 14s
2010-11-26 09:05:28 (237 B/s) - `3072byte.dat' へ保存終了 [3374]と,正しくヘッダを認識されませんでした.そのため,HEADコマンドでHTTPヘッダを調べてみたところ,
$ HEAD http://example.com/dat/3072byte.dat 200 OK Connection: close Date: Fri, 26 Nov 2010 00:12:03 GMT Accept-Ranges: bytes ETag: "2721c8-c00-4951b36fc4280" Server: Apache Content-Length: 3072 Content-Type: application/x-ns-proxy-autoconfig Last-Modified: Mon, 15 Nov 2010 18:00:26 GMT Client-Date: Fri, 26 Nov 2010 00:11:50 GMT Client-Peer: 192.168.121.2:80 Client-Response-Num: 1
と正しく認識されます.
この問題に対して,なにか助言を頂ければと思いまして投稿いたしました.
よろしくおねがいします.
apache 2 のバージョンは以下のとおりです.
$ dpkg -l | grep apache ii apache2 2.2.14-5ubuntu8.4 Apache HTTP Server metapackage ii apache2-mpm-prefork 2.2.14-5ubuntu8.4 Apache HTTP Server - traditional non-threade ii apache2-utils 2.2.14-5ubuntu8.4 utility programs for webservers ii apache2.2-bin 2.2.14-5ubuntu8.4 Apache HTTP Server common binary files ii apache2.2-common 2.2.14-5ubuntu8.4 Apache HTTP Server common files ii libapache2-mod-php5 5.3.2-1ubuntu4.5 server-side, HTML-embedded scripting langua
オフライン
shirakawa による投稿:
サーバ機(自分自身)からのダウンロードは,どちらのファイルも問題なくダウンロードすることができます.
<-- (snip) -->
3072byte のファイルをダウンロードするとコード:
$ wget http://example.com/dat/3072byte.dat --2010-11-26 09:05:13-- http://example/dat/3072byte.dat example.com をDNSに問いあわせています... 192.168.xxx.yyy example.com|192.168.xxx.yyy|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 ヘッダがないので、HTTP/0.9 だと仮定します 長さ: 特定できません `3072byte.dat' に保存中 [ <=> ] 3,374 --.-K/s 時間 14s 2010-11-26 09:05:28 (237 B/s) - `3072byte.dat' へ保存終了 [3374]と,正しくヘッダを認識されませんでした.
ローカルで問題無いことや、3072byteのファイルをネットワーク越しにダウンロードしようとしたときの転送速度が異常に低いことを考えると、なにかしらかのネットワーク的な問題が起きているような気がします。
例えば、
1. クライアントからwgetでインターネットにあるなにか大きなファイルをダウンロードするとどうなるか
2. クライアントからfirefoxなどでインターネットにあるなにか大きなファイルをダウンロードするとどうなるか
3. クライアントからfirefoxなどで問題になっているapache2サーバから大きなファイルをダウンロードするとどうなるか
4. クライアントからapache2サーバにpingを撃つとどうなるか。
さらに、
ping -c 4 -M do target -s 1472
などとして1472の部分を変えてサイズを変更し、通る最大のサイズを調べ、それにそって、MTUの値をデフォルトの自動(になっていると思われます)から適当な値に設定するとどうなるか。
あるいは、簡単に1000程度に設定して影響があるかどうかだけ見るのもアリかと思います。
などを試してみると問題箇所が見えてくるかも知れません。
オフライン
hmatsue さん,アドバイス頂きありがとうございます.
仰って下さったことを致しましたので,報告申し上げます.
> 1. クライアントからwgetでインターネットにあるなにか大きなファイルをダウンロードするとどうなるか
ubuntu 10.10 Desktop 日本語 Remix CD を wget を用いてダウンロード致しましたが,特に問題なくダウンロードすることができました.
$ wget http://cdimage-u-toyama.ubuntulinux.jp/releases/10.10/ubuntu-ja-10.10-desktop-i386.iso --2010-12-01 17:30:13-- http://cdimage-u-toyama.ubuntulinux.jp/releases/10.10/ubuntu-ja-10.10-desktop-i386.iso cdimage-u-toyama.ubuntulinux.jp をDNSに問いあわせています... 160.26.2.180 cdimage-u-toyama.ubuntulinux.jp|160.26.2.180|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 717613056 (684M) [application/x-iso9660-image] `ubuntu-ja-10.10-desktop-i386.iso' に保存中 100%[========================================>] 717,613,056 1.19M/s 時間 10m 24s 2010-12-01 17:40:39 (1.10 MB/s) - `ubuntu-ja-10.10-desktop-i386.iso' へ保存完了 [717613056/717613056] $ md5sum ubuntu-ja-10.10-desktop-i386.iso e81fc6df1d31c8ab02dbaaec17a93e82 ubuntu-ja-10.10-desktop-i386.iso
と問題なくダウンロードされ,MD5も正常でした.
> 2. クライアントからfirefoxなどでインターネットにあるなにか大きなファイルをダウンロードするとどうなるか
firefox からも ubuntu 10.10 Desktop 日本語 Remix CD のダウンロードを試みましたが,問題なくダウンロードされました.また,同ネットワーク内のクライアント機で普段ネットサーフィンをしている中,様々なウェブサイトを閲覧したりファイルをダウンロードしておりますが,OSに関係なく(Windows xp, Windows 7 32bit, ubuntu 10.10)ダウンロードする際に問題が起こったことはありませんでした.
> 3. クライアントからfirefoxなどで問題になっているapache2サーバから大きなファイルをダウンロードするとどうなるか
firefox にて,問題のファイルをダウンロードを試みましたところ「開始しました...」とメッセージが出ますが,ダウンロードの進捗状況が表示されず突然ダウンロードが終了した状態となりました.
また,画像ファイルを apache 上に置き firefox でアクセスを試みましたが,
「画像ファイル "http://example.com/image.png" は壊れているため、表示できませんでした。」
というメッセージが表示され画像が表示されませんでした.
> 4. クライアントからapache2サーバにpingを撃つとどうなるか。
サーバ側の初期MTUは,1500 でした.その状態で,特にオプションを付けずに ping コマンドを打つと問題なく返答が帰ってきます.
$ ping -c 2 192.168.xxx.yyy PING 192.168.xxx.yyy (192.168.xxx.yyy) 56(84) bytes of data. 64 bytes from 192.168.xxx.yyy: icmp_req=1 ttl=64 time=0.838 ms 64 bytes from 192.168.xxx.yyy: icmp_req=2 ttl=64 time=0.641 ms --- 192.168.xxx.yyy ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.641/0.739/0.838/0.102 ms
また,アドバイスを頂きました通り
$ ping -c 4 -M do 192.168.xxx.yyy -s 1472 PING 192.168.xxx.yyy (192.168.xxx.yyy) 1472(1500) bytes of data. 1480 bytes from 192.168.xxx.yyy: icmp_req=1 ttl=64 time=1.15 ms 1480 bytes from 192.168.xxx.yyy: icmp_req=2 ttl=64 time=2.31 ms 1480 bytes from 192.168.xxx.yyy: icmp_req=3 ttl=64 time=1.14 ms 1480 bytes from 192.168.xxx.yyy: icmp_req=4 ttl=64 time=1.18 ms --- 192.168.xxx.yyy ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 1.149/1.452/2.316/0.499 ms
と断片化せず ping を送りましたが全く問題なく返答が帰ってきました.
サーバ機のMTUを MTU 4000, 1300, 1000, 500 と変更し 1.〜4.の手順を試みました.
MTU 4000 では,初期設定と現象は変わりませんでした.
MTU 1300, 1000, 500 では,問題があると思いました現象としましては,ping を用いて 1472(1500) bytes を送信すると
$ ping -c 4 -M do 192.168.xxx.yyy -s 1472 PING 192.168.xxx.yyy (192.168.xxx.yyy) 1472(1500) bytes of data. [タイプ: Ctrl+C] --- 192.168.xxx.yyy ping statistics --- 4 packets transmitted, 0 received, 100% packet loss, time 3023ms
と 返答が来なかったため, Ctrl+C で中断しました.しかし,
$ ping -c 4 -M do 192.168.xxx.yyy -s 1500 From 192.168.xxx.zzz icmp_seq=1 Frag needed and DF set (mtu = 1500)
だと MTU を 1500 にしなさいと帰ってます.
送信するサイズに関係なく''Frag needed and DF set (mtu = 1500)''というメッセージが帰ってくるものと思っておりましたが,異なるのでしょうか,教えて頂ければ幸いかと存じます.
また,MTU 1000以下にすると
$ wget http://example.com/dat/2048byte.dat
--2010-12-01 18:45:15-- http://example.com/dat/2048byte.dat
example.com をDNSに問いあわせています... 192.168.xxx.yyy
example.com|192.168.xxx.yyy|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 ヘッダがないので、HTTP/0.9 だと仮定します
長さ: 特定できません
`2048byte.dat' に保存中
[ <=> ] 2,350 --.-K/s 時間 14s
2010-12-01 18:45:30 (165 B/s) - `2048byte.dat' へ保存終了 [2350]と,2048byte についても 3072byte をダウンロードしたときと全く同じ現象が起こりました.
他に試みたこととしまして,ルータなどハードウェアの問題も考えました.
ネットワーク機器であるルータ,LANケーブルを別のものに変更してみましたが解決されませんでした.
また,サーバが所属するネットワークにてクライアント機(ubuntu 10.10 デスクトップ版 日本語)に
apache2(2.2.16-1ubuntu3.1) サーバを立てサーバと同じ現象が発生しないか検証しましたところ全く問題ありませんでした.
サーバ機でも
$ sudo apt-get remove --purge apache2 $ sudo apt-get install apache2
と設定をすべて削除し,再インストールを試みましたが問題は解決されませんでした.
ubuntu や eth0 など根本的な部分に問題があるのではないかと感じましたが,いかがでしょうかお答えいただけばと思います.
オフライン
shirakawa による投稿:
> 1. クライアントからwgetでインターネットにあるなにか大きなファイルをダウンロードするとどうなるか
ubuntu 10.10 Desktop 日本語 Remix CD を wget を用いてダウンロード致しましたが,特に問題なくダウンロードすることができました.
shirakawa による投稿:
> 2. クライアントからfirefoxなどでインターネットにあるなにか大きなファイルをダウンロードするとどうなるか
firefox からも ubuntu 10.10 Desktop 日本語 Remix CD のダウンロードを試みましたが,問題なくダウンロードされました.
この結果を見るとクライアントPCとルータの間の通信に問題は無さそうです。
shirakawa による投稿:
> 3. クライアントからfirefoxなどで問題になっているapache2サーバから大きなファイルをダウンロードするとどうなるか
firefox にて,問題のファイルをダウンロードを試みましたところ「開始しました...」とメッセージが出ますが,ダウンロードの進捗状況が表示されず突然ダウンロードが終了した状態となりました.
また,画像ファイルを apache 上に置き firefox でアクセスを試みましたが,
「画像ファイル "http://example.com/image.png" は壊れているため、表示できませんでした。」
というメッセージが表示され画像が表示されませんでした.
クライアント側で使用するソフトの影響では無さそうですね。
以上から怪しそうなのはサーバPCとルータ間の通信のように思えます。
shirakawa による投稿:
コード:
$ ping -c 4 -M do 192.168.xxx.yyy -s 1500 From 192.168.xxx.zzz icmp_seq=1 Frag needed and DF set (mtu = 1500)だと MTU を 1500 にしなさいと帰ってます.
送信するサイズに関係なく''Frag needed and DF set (mtu = 1500)''というメッセージが帰ってくるものと思っておりましたが,異なるのでしょうか,教えて頂ければ幸いかと存じます.
ちょっと自信なしですが、ルータとクライアント間がMTU=1500まででしか通信できたいためではないでしょうか。パケットサイズが1500だとMTUでは1528になるかと思います。
ここまでで疑問に感じるのはサーバPCのMTUを1500に設定すれば、問題なく通信できるのではないかという点です。しかしながら、初期設定で1500を入れてあったにもかかわらず通信できないことを考えるとサーバPCのNICドライバに問題があるような気がします。サーバPCで、
sudo lspci -v
としてNICの型式や使用しているカーネルモジュールを調べ、それをキーワードに調査すればなにか判ることがあるかも知れません。
# 既知の問題であればワークアラウンドもあるかも。
# なんとなくサーバPCのNICだけJumboFlameが使えるもので、かつ、ドライバに問題があり、
# MTUが思ったとおりに設定できていないとかはないでしょうか。
あと、MTU=1500に設定した状態でifconfigすると、MTUが1500に設定されているように見えますでしょうか。
# この結果はもしかしたらアテにできないかも知れませんが。。
オフライン
hmatsueさん
ご返答ありがとうございます.
hmatsueさんのおっしゃる通りでNICに問題がありました.`dmesg' で 'eth0' を検索したところ.
$ dmesg | grep eth0 [ 4.149232] ADDRCONF(NETDEV_UP): eth0: link is not ready [ 6.461648] atl1c 0000:02:00.0: atl1c: eth0 NIC Link is Up<1000 Mbps Full Duplex> [ 6.461846] ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready [ 16.764014] eth0: no IPv6 routers present
''eth0: link is not ready'' と カーネルのリンクが貼られていないかのような返答が来ました.
また,`lspci -v' の返答でNICに関係のありそうな記述は
02:00.0 Ethernet controller: Atheros Communications AR8131 Gigabit Ethernet (rev c0)
Subsystem: Elitegroup Computer Systems Device 8131
Flags: bus master, fast devsel, latency 0, IRQ 27
Memory at febc0000 (64-bit, non-prefetchable) [size=256K]
I/O ports at ec00 [size=128]
Capabilities: <access denied>
Kernel driver in use: atl1c
Kernel modules: atl1cという記述でした.''Atheros Communications AR8131'' がチップセット名と見て検索してみたところ.
Ubuntu in Launchpadにて,バグが報告されていました.https://bugs.launchpad.net/ubuntu/+source/linux/+bug/386468
さらに,検索してみたところ
http://ubuntu-virginia.ubuntuforums.org/showthread.php?t=1273839&page=2
にて,AR81シリーズに対するLinuxドライバがあることがわかりました.
そこで, http://www.chipdrivers.com/download-get/786/191/36/ からドライバをダウンロードし,
$ tar zxvf AR81Family-linux-v1.0.1.14.tar.gz $ make $ sudo make install
とドライバをインストールしました.
あわせてubuntu 日本語フォーラムにて,AR8131に関する報告がされていまして,以下の記事の通り
https://forums.ubuntulinux.jp/viewtopic.php?pid=47710
''/etc/default/grub'' に 'pci=use_crs' を追記いたしました.
そのあと
$ sudo update-grub $ sudo shutdown -r now
とサーバ機を再起動したところ問題が解消されました.
正しくダウンロードされなかった問題のファイルも
$ wget http://example.com/dat/3072byte.da --2010-12-06 19:05:11-- http://example.com/dat/3072byte.dat example.com をDNSに問いあわせています... 192.168.xxx.yyy example.com|192.168.xxx.yyy|:80 に接続しています... 接続しました。 HTTP による接続要求を送信しました、応答を待っています... 200 OK 長さ: 3072 (3.0K) [application/x-ns-proxy-autoconfig] `3072byte.dat' に保存中 100%[========================================================>] 3,072 --.-K/s 時間 0.001s 2010-12-06 19:05:11 (2.94 MB/s) - `3072byte.dat' へ保存完了 [3072/3072]
と,このように正しくダウンロードされました.
`dmesg' の内容は変更ありませんでした.しかし,`lspci -v' のカーネルドライバとモジュールの部分については変化があり現在はこのようになっております.
02:00.0 Ethernet controller: Atheros Communications AR8131 Gigabit Ethernet (rev c0)
Subsystem: Elitegroup Computer Systems Device 8131
Flags: bus master, fast devsel, latency 0, IRQ 27
Memory at febc0000 (64-bit, non-prefetchable) [size=256K]
I/O ports at ec00 [size=128]
Capabilities: <access denied>
Kernel driver in use: atheros_eth
Kernel modules: atl1c, atl1ehmatsueさんのおかげで原因の特定と問題を解消することができました.本当にありがとうございます.
オフライン
詳細な調査結果、および、ワークアラウンドの適用手順の投稿、ありがとうございました。
非常に参考になりました。 :)
恐らくご存知かとは思いますが、カーネルモジュールはカーネルが更新されると再コンパイルする必要があります。
もし、お時間と興味がありましたら、
https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo
などを参考にして、カーネルの更新時に自動的にコンパイル、インストールされるように設定しておくと便利かも知れません。
一方で、手動でコンパイル、インストールするようにしておく(現状のママ)にしておくことで、それを機会にメーカ製ドライバが更新されていないかチェックをする気になったり、カーネル側でバグ修正されたことを認識できたりと、メリットもあろうかと思いますので、このあたりは好みの問題かも知れません。
# バグフィックスなども通常のアップデートで適用されるため、
# 基本的にはカーネル付属のUbuntu公式のもので動かせれば、
# それが一番良いかと思います。
オフライン
すみません。書き忘れましたが、恐らく、atl1cは不要かと思います(逆にatl1eと競合して問題を起こすかも知れません)ので、/etc/modprobe.d/以下でblacklistしておいた方がよいかも知れません。
# って、blacklistしておくとカーネルが更新されても、自動では新しいドライバは読み込まれないですね。。
# 先のコメントの一部撤回です。
オフライン
hmatsueさん
さらなるアドバイスありがとうございます.
カーネルモジュールの自動更新については全く知らなかったことなので大変勉強になりした.
今回ダウンロードした AR81シリーズのドライバでは, dkms について
$ sudo make dkms
と,make にて '''/usr/src''' の正しいディレクトリにインストールされました.
また,'atl1c' についてですが,'''/etc/modprobe.d/blacklist.conf''' に
''blacklist atl1c'' と記述し,再起動いたしました.
`lspci -v' では,
02:00.0 Ethernet controller: Atheros Communications AR8131 Gigabit Ethernet (rev c0)
〜中略〜
Kernel driver in use: atheros_eth
Kernel modules: atl1c, atl1eと atl1c が読み込まれているような記述がなされいましたが.`lsmod | grep "atl1"' では,
atl1e 61286 0
と atl1e しか出力されていなかったので 'atl1c' はロードされていないと思います.
今回でまた,Linux について詳しく知ることができました.ありがとうございます.
オフライン