お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2010-11-26 09:23:03

shirakawa
メンバ
登録日: 2009-12-07

ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

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

オフライン

 

#2 2010-11-26 18:08:03

hmatsue
アドバイザ
登録日: 2009-03-10

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

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程度に設定して影響があるかどうかだけ見るのもアリかと思います。

などを試してみると問題箇所が見えてくるかも知れません。

オフライン

 

#3 2010-12-01 19:12:34

shirakawa
メンバ
登録日: 2009-12-07

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

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 など根本的な部分に問題があるのではないかと感じましたが,いかがでしょうかお答えいただけばと思います.

オフライン

 

#4 2010-12-01 20:48:07

hmatsue
アドバイザ
登録日: 2009-03-10

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

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に設定されているように見えますでしょうか。
# この結果はもしかしたらアテにできないかも知れませんが。。

オフライン

 

#5 2010-12-06 19:17:16

shirakawa
メンバ
登録日: 2009-12-07

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

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, atl1e

hmatsueさんのおかげで原因の特定と問題を解消することができました.本当にありがとうございます.

オフライン

 

#6 2010-12-06 20:20:27

hmatsue
アドバイザ
登録日: 2009-03-10

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

詳細な調査結果、および、ワークアラウンドの適用手順の投稿、ありがとうございました。
非常に参考になりました。 :)

恐らくご存知かとは思いますが、カーネルモジュールはカーネルが更新されると再コンパイルする必要があります。
もし、お時間と興味がありましたら、
https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo
などを参考にして、カーネルの更新時に自動的にコンパイル、インストールされるように設定しておくと便利かも知れません。

一方で、手動でコンパイル、インストールするようにしておく(現状のママ)にしておくことで、それを機会にメーカ製ドライバが更新されていないかチェックをする気になったり、カーネル側でバグ修正されたことを認識できたりと、メリットもあろうかと思いますので、このあたりは好みの問題かも知れません。

# バグフィックスなども通常のアップデートで適用されるため、
# 基本的にはカーネル付属のUbuntu公式のもので動かせれば、
# それが一番良いかと思います。

オフライン

 

#7 2010-12-06 20:24:08

hmatsue
アドバイザ
登録日: 2009-03-10

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

すみません。書き忘れましたが、恐らく、atl1cは不要かと思います(逆にatl1eと競合して問題を起こすかも知れません)ので、/etc/modprobe.d/以下でblacklistしておいた方がよいかも知れません。
# って、blacklistしておくとカーネルが更新されても、自動では新しいドライバは読み込まれないですね。。
# 先のコメントの一部撤回です。

オフライン

 

#8 2010-12-07 13:43:22

shirakawa
メンバ
登録日: 2009-12-07

Re: ubuntu 10.04 LTS における apache2 の一定のサイズを超えるとファイルが壊れる問題について

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 について詳しく知ることができました.ありがとうございます.

オフライン

 

Board footer

Powered by FluxBB