apacheを使ったWebサーバ経由でのファイルのダウンロードが非常に遅い場合の対処
http経由でのファイルのダウンロード、しかも静的ファイル。こんなに遅かったっけ?
タイミングによっては、たった30MBのファイルのダウンロードが、10時間。
ってありえない。しかもそのサーバはファイルアップローダとして使っているサーバだからさぁどうしよう。
サーバを囲む他の端末でネットワークのトラフィックが激しいのかとも思って調査したのですが、ftpやwinscpで同じファイルをダウンロードしたところ、普通にダウンロードができてしまいます。またサーバ内部から外部にPINGを打っても、速度に異常なし。
# apachectl -v Server version: Apache/2.2.15 (Unix) Server built: Jul 24 2015 11:52:28
apacheのバージョンも古いわけではない。
数週間悩んだあげく、やっと謎が解けました!
救ってくれたのは、この2つのブログ。助かりました、ありがとうございます!
apacheサーバからの送信速度がやたら低くなる問題 – ヒマは見つけるモノじゃない、つくるモノだ
Proxyとか :: Apache高速化 EnableMMAP Off EnableSendfile off で転送速度アップ
結論としては、下記の2つのパラメタがデフォルトでOnになっているのだけど、それが阻害ダウンロード速度を遅くすることもあるのということ。
# http://www.itc.yorku.ca/manual/ja/mod/core.html#enablemmap # このディレクティブは配送中にファイルの内容を読み込む必要があるときに httpd がメモリマッピングを使うかどうかを制御します。デフォルトでは、 例えば、mod_include を使って SSI ファイルを配送 するときのように、ファイルの途中のデータをアクセスする必要があるときには Apache は OS がサポートしていればファイルをメモリにマップします。 # このメモリマップは性能の向上を持たらすことがあります。 しかし、環境によっては運用上の問題を防ぐためにメモリマッピングを 使用しないようにした方が良い場合もあります: # マルチプロセッサシステムの中にはメモリマッピングをすると httpd の 性能が落ちるものがあります。 # NFS マウントされた DocumentRoot では、httpd がメモリマップしている間にファイルが削除されたり 短くなったりしたときに起こるセグメンテーションフォールトのために httpd がクラッシュする可能性があります。 # これらの問題に当てはまるサーバの設定の場合は、以下のようにして ファイルの配送時のメモリマッピングを使用不可にしてください: EnableMMAP Off # http://www.itc.yorku.ca/manual/ja/mod/core.html#enablesendfile # このディレクティブはクライアンにファイルの内容を送るときに httpd がカーネルの sendfile サポートを使うかどうかを制御します。デフォルトでは、 例えば静的なファイルの配送のように、リクエストの処理にファイルの 途中のデータのアクセスを必要としないときには、Apache は OS が サポートしていればファイルを読み込むことなく sendfile を使って ファイルの内容を送ります。 # sendfile は read と send を別々に行なうことと、バッファの割り当てを 回避します。しかし、プラットフォームやファイルシステムの中には 運用上の問題を避けるためにこの機能を使用不可にした方が良い場合があります: # プラットフォームの中にはビルドシステムが検知できなかった、壊れた sendfile のサポートが存在するものがあります。これは特に バイナリが別のマシンでビルドされ、壊れた sendfile のあるマシンに 移動したときに起こります。 # Linux では、sendfile を用いると、 IPv6 使用時に存在する特定ネットワークカードの TCP-checksum オフロードのバグを踏んでしまいます。 # ネットワークマウントされた DocumentRoot (例えば NFS や SMB) では、カーネルは自身のキャッシュを使ってネットワークからのファイルを 送ることができないことがあります。 # これらの問題に当てはまるサーバの設定の場合は、以下のようにして この機能を使用不可にしてください: EnableSendfile Off
このような感じで、明示的にOffにしてサービスを立ち上げ直したら、解決しました。
EnableSendfileは、直接的には影響はないのだけど、IPv6使用時にバグを踏むかもって書いてるので、敢えてOffにしました。
MySQLもそうだけど、時折マニュアルをみて、どういうパラメタが追加されたのか、どういう機能が変わったのか、精読する必要があるのだなと、痛感。
関連記事
-
-
[Linux]複数ファイルの文字コードを一括で調べる – nkf
開発をしていると、たまに文字コードが異なる状態で保存されたりする。 UTF-8の …
-
-
[CentOS]yumが失敗する(db3 エラー) – Thread died in Berkeley DB library
yumが実行できなくなった! yumコマンドがうまく動かない環境に遭遇した。 解 …
-
-
GeoIPのインストール
IPアドレスから国や都市を取得するためのライブラリが、MaxMind社のGeoI …
-
-
シンボリックリンクの作成
やっと、本日勘違いしていたことに気づきました(汗 思い込みはあかんねー。 ※[シ …
-
-
開いているポートを調べる(nmap)
開いているポートを調べる(nmap) 外部公開しているポートを調べる方法はいくつ …
-
-
root宛メールを転送
logwatchなど、root宛にやってきたメールを指定のメルアドに転送するには …
-
-
logrotate
■logrotateを直接実行 ■参考URL Stray Penguin  …
-
-
ext2でのサブディレクトリの配置上限数
やってきたメールをローカルに、サブディレクトリを作成して保存していたら、どう考え …
-
-
qmailの転送設定
正確にはvpopmail用の設定らしい。 ○○○-△△△@hogehoge.co …
-
-
CentOS系コマンド覚書
※自分がよく使うもので忘れやすいものを書いてるだけなので、これといってすごいもの …