

お世話になります

Webページにアクセスした際に、画像や CSS, JS などを別サーバから読むようにして、  
そちらを、キャッシュするようにしております。  
キャッシュには、 Apache の `mod_cache` を使っているのですが、  
アクセスが増大するタイミングで、以下のエラーが出て、その後、  
まったくキャッシュしなくなるという問題が起きており、ちょっと困っております

[code]

    [Mon Jan 05 09:43:37 2015] [error] (103)Software caused connection abort: cache: error returned while trying to return disk cached data
    
[/code]

conf設定ファイルは以下のようになっております

[code]

    ##############################
    #
    # Location  Area
    #
    ##############################
    <Location "/qr_cu/">
        ProxyPass balancer://panda_customer_cluster/
        ProxyPassReverse balancer://panda_customer_cluster/
    </Location>
    
    <Location "/qr_cl/">
        ProxyPass balancer://panda_client_cluster/
        ProxyPassReverse balancer://panda_client_cluster/
    </Location>
    
    <Location "/portal_cu/">
        ProxyPass balancer://koala_customer_cluster/
        ProxyPassReverse balancer://koala_customer_cluster/
    </Location>
    
    <Location "/idv_tl/">
        ProxyPass balancer://tool_cluster/
        ProxyPassReverse balancer://tool_cluster/
    </Location>
    
    <Location "/tgb_cu/">
        ProxyPass balancer://owl_customer_cluster/
        ProxyPassReverse balancer://owl_customer_cluster/
    </Location>
    
    <Location "/tgb_cl/">
        ProxyPass balancer://owl_client_cluster/
        ProxyPassReverse balancer://owl_client_cluster/
    </Location>
    
    ##############################
    #
    # Proxy balancer Area
    #
    ##############################
    
    <Proxy balancer://panda_customer_cluster>
        SetOutputFilter DEFLATE
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
        Header append Vary User-Agent env=!dont-vary
        BalancerMember http://xxx.xxx.xxx.xxx
    </Proxy>
    
    <Proxy balancer://panda_client_cluster>
        BalancerMember http://xxx.xxx.xxx.xxx
    </Proxy>
    
    <Proxy balancer://koala_customer_cluster>
        SetOutputFilter DEFLATE
        BrowserMatch ^Mozilla/4 gzip-only-text/html
        BrowserMatch ^Mozilla/4\.0[678] no-gzip
        BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
        SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
        Header append Vary User-Agent env=!dont-vary
        BalancerMember http://xxx.xxx.xxx.xxx
    </Proxy>
    
    <Proxy balancer://tool_cluster>
        BalancerMember http://xxx.xxx.xxx.xxx
    </Proxy>
    
    <Proxy balancer://owl_customer_cluster>
        BalancerMember http://xxx.xxx.xxx.xxx
    </Proxy>
    
    <Proxy balancer://owl_client_cluster>
        BalancerMember http://xxx.xxx.xxx.xxx
    </Proxy>
    
    ##############################
    #
    # Chache Area
    #
    ##############################
    <IfModule mod_cache.c>
        <IfModule mod_disk_cache.c>
            CacheIgnoreCacheControl On
            CacheIgnoreNoLastMod On
            CacheIgnoreHeaders Set-Cookie User-Agent Vary Cookie Server
            CacheDefaultExpire 86400
            CacheRoot /var/www/xxxxxx/image/cache
            CacheEnable disk /qr_cu/
            CacheEnable disk /qr_cl/
            CacheEnable disk /portal_cu/
            CacheEnable disk /idv_tl/
            CacheEnable disk /tgb_cu/
            CacheEnable disk /tgb_cl/
            CacheDirLevels 6
            CacheDirLength 3
            CacheMaxFileSize 10000000
        </IfModule>
    </IfModule>
    
[/code]

この辺り([Apache/mod_cache: “Error 103 Software caused connection
abort”](https://serverfault.com/questions/491309/apache-mod-cache-
error-103-software-caused-connection-
abort))とか見てるのですが、明確な回答が見つかってないようなのですが、心当たりのある方いらっしゃいますでしょうか？

よろしくお願いいたします。

追記です

回答ありがとうございます。  
コネクション数を上げることを試してみたのですが、あまり変わりませんでした。  
ただ、その確認の際に、空きメモリを確認したところ、120MBくらいしか平均で残っておらず、アクセスが増大したタイミングで、それを全て食いつぶしてるのではないかと推測していますが、いかがでしょうか。

[code]

    -bash-4.1$ free
                 total       used       free     shared    buffers     cached
    Mem:       3924856    3803180     121676          0    1529244    1146440
    -/+ buffers/cache:    1127496    2797360
    Swap:     2097148      13844    2083304
    
[/code]

さらに追記です。mod_proxyのエラーが出ていましたので、そちらも追記します

以下のエラーがアクセス増大時に出てます。

[code]

    [Mon Jan 05 12:06:56 2015] [error] (70007)The timeout specified has expired: proxy: HTTP: attempt to connect to xxx.xxx.xxx.xxx:80 (xxx.xxx.xxx.xxx) failed
    [Mon Jan 05 12:06:56 2015] [error] ap_proxy_connect_backend disabling worker for (xxx.xxx.xxx.xxx)
    [Mon Jan 05 12:08:29 2015] [error] (70007)The timeout specified has expired: proxy: HTTP: attempt to connect to xxx.xxx.xxx.xxx:80 (xxx.xxx.xxx.xxx) failed
    [Mon Jan 05 12:08:29 2015] [error] ap_proxy_connect_backend disabling worker for (xxx.xxx.xxx.xxx)
    [Mon Jan 05 12:14:19 2015] [error] (70007)The timeout specified has expired: proxy: HTTP: attempt to connect to xxx.xxx.xxx.xxx:80 (xxx.xxx.xxx.xxx) failed
    [Mon Jan 05 12:14:19 2015] [error] ap_proxy_connect_backend disabling worker for (xxx.xxx.xxx.xxx)
    
[/code]

mod_proxyのエラーのようですが。。。  
よろしくお願いいたします。


CC BY-SA 3.0
2015-01-05T03:29:28.607
3094
2015-01-07T04:12:52.430
2017-04-13T12:14:55.443
-1
403
question
apache mod-cache
mod_cache モジュールから `cache: error returned while trying to return disk cached data` が出てキャッシュされなくなる


ちょっと情報が古いのでまったく自信がないのですが、[キャッシュを飛ばして CacheDirLength を 2 から 1
にした](http://www.webhostingtalk.com/showthread.php?t=882600)
的な対応で緩和(？)したような例もあるようです。サブディレクトリの数が減ったことによる効果ですかね？( ext2/3 で有効かも)

あと、質問内にある SO の情報は Apache/2.2.14 とのことだったので
[Changes](http://www.apache.org/dist/httpd/CHANGES_2.2) を眺めてみたのですが `mod_cache`
で、ちょくちょく修正がかかっているように読めます。

最近も、 Vary header での Thundering Herd 問題と戦った痕跡があります。( CacheLock
との併用時の話っぽいので本件とは関係無さそうです)

これも自信がないですが 2.2 系の最新か、 2.4.x にすると問題は解決するかもしれません。

(あとは、キャッシュして頑張っている努力が台無しになりそうですが、 Vary header を調整して、ディスクI/O に変化を与えてみるとか。。)


CC BY-SA 3.0
2015-01-05T07:23:55.500
3113
2015-01-05T11:59:58.333
2015-01-05T11:59:58.333
2992
2992
3094
answer


以下は mod_cache のソースコード(mod_cache.c)の一部分で、例のエラーメッセージが出力されている部分です。

[code]

    /* kick off the filter stack */
    out = apr_brigade_create(r->pool, r->connection->bucket_alloc);
    rv = ap_pass_brigade(r->output_filters, out);
    if (rv != APR_SUCCESS) {
        if (rv != AP_FILTER_ERROR) {
            ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
                         "cache: error returned while trying to return %s "
                         "cached data",
                         cache->provider_name);
        }
        return rv;
    }
    
[/code]

問題の原因は、`ap_pass_brigade` が false を返しているからですが、ではなぜ false を返すのかと言えば、その前の
`ap_brigate_create` に問題がありそうなのです。手元に実環境がないので断定は出来ないのですが、Apache
サーバのプロセスかスレッドにアクセスが集中してコネクションプールが逼迫しているのではないか、と推測しています。  
確か、Apache
の設定に最大コネクション数を設定する変数があったのではないかと記憶しているのですが(間違っていたらごめんなさい)、それを増加させてみてはいかがでしょうか。


CC BY-SA 3.0
2015-01-05T08:02:00.760
3115
2015-01-05T08:02:00.760
3094
answer


mod_cache のエラーメッセージについては Red Hat に情報がありました。

[Error, apache, 103 Software caused connection
abort](https://access.redhat.com/solutions/139873) (閲覧にはサブスクリプション契約が必要)

内容を要約すると、

  * ブラウザで読み込み中にストップを押すなど、TCP接続が中止された場合にこのエラーメッセージが出る。 バージョン 2.4.x ではデバッグレベルのログに変更された。
  * 実際に問題になっているようなら、ネットワークなど、他の原因を探るべし。

とのことです。

mod_proxy のエラーメッセージと合わせての推測となりますが、Backend に接続待ちの間にブラウザ側でタイムアウトしてブラウザと httpd
の接続が中止、結果として mod_cache のエラーメッセージが出ているのではないでしょうか。httpd の Timeout
をブラウザのタイムアウト値よりも短くして、サーバー側で先にタイムアウトさせてしまえば、mod_cache のエラーメッセージは抑制できるかもしれません。

mod_proxy の方は、Backend への接続でタイムアウトですので、Backend 側の処理が間に合っていない状況になっていると思います。
障害発生時に mod_proxy 側で "netstat -tan" (Linux を想定)の出力に SYN_SENT が多くなっている状況。
それぞれの負荷を調べるとか、OS のリソース不足などのエラーメッセージが出ていないか(/var/log/messages
など)とか、確認するといいと思います。

メモリ使用量については、buffers (ブロックデバイスのキャッシュ)が多いですね。これ自体は問題ではないと思いますが、io_wait
が多い(vmstat の wa 欄)ようならば、ディスク書き込み待ちになっているので、httpd 側の負荷(ロードアベレージ)が上がる原因になります。


CC BY-SA 3.0
2015-01-05T16:00:36.317
3144
2015-01-05T16:00:36.317
4603
3094
answer