web-dev-qa-db-ja.com

ApacheがCPUとメモリを大量に消費している

Apache WebサーバーでCPUがメモリをロードするときに問題が発生します。

仮想マシンでbuntu Server 12.04 LTSを実行しています。私たちのサーバーには次の仕様があります:

  • 8GB RAM;
  • 4つのvCPU(12ghz);

Drupal(7.23)ベースのWebサイトを実行するようにサーバーを構成しました。したがって、Apache、PHP、MySQLをインストールしました...バージョンは以下のとおりです。

  • Apache 2.2.22;
  • PHP 5.3.10(PHPはApacheモジュールとして実行されています。);
  • APC 3.1.7;
  • MySQL 5.5.31(すべてのinnodbテーブル);

Apacheモジュールも実行しています。見てください(apachectl -M):

  • core_module(静的)
  • log_config_module(静的)
  • logio_module(静的)
  • mpm_prefork_module(静的)
  • http_module(静的)
  • so_module(静的)
  • actions_module(共有)
  • alias_module(共有)
  • authz_Host_module(共有)
  • deflate_module(共有)
  • dir_module(共有)
  • env_module(共有)
  • include_module(共有)
  • mime_module(共有)
  • php5_module(共有)
  • proxy_module(共有)
  • proxy_http_module(共有)
  • reqtimeout_module(共有)
  • rewrite_module(共有)
  • setenvif_module(共有)
  • ssl_module(共有)
  • status_module(共有)

Apache2.confには、次の設定があります。

    Timeout 90
    KeepAlive On
    MaxKeepAliveRequests 80
    KeepAliveTimeout 5
    HostnameLookups Off
    LogLevel warn

    <IfModule mpm_prefork_module>
        StartServers          10
        MinSpareServers       10
        MaxSpareServers       30
        MaxClients           120
        MaxRequestsPerChild 1000
    </IfModule>

私のサイトの仮想ホスト

    <VirtualHost *:80>
        ServerName blabla.bla.bla
        ServerAdmin [email protected]
        DocumentRoot /l/disk0/site/public_html

        <Directory />
            AllowOverride None
        </Directory>

        <Directory /l/disk0/site/public_html>
            Options MultiViews Indexes Includes FollowSymLinks ExecCGI
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>

        LogLevel warn
        ErrorLog "/l/disk0/site/logs/Apache/site/error.log"
        CustomLog "/l/disk0/site/logs/Apache/sit/access.log" combined
        SSLProxyEngine on
        RewriteEngine   on
        RewriteLog     logs/rewrite_www_log
        RewriteLogLevel        0

        Include rewrites-www.conf
</VirtualHost>

Drupalモジュール:

  • ACL 7.x-1.0
  • APC-代替PHPキャッシュ7.x-1.0-beta4
  • Boost 7.x-1.0-beta2
  • キャッシュの有効期限7.x-2.0-beta2
  • CAPTCHA 7.x-1.0
  • カオスツールスイート(ctools)7.x-1.3
  • 日付7.x-2.6
  • ドメインアクセス7.x-3.10
  • ドメインブロック7.x-2.0
  • ドメインCTools 7.x-1.3
  • ドメインロケール7.x-1.0-beta3
  • ドメイン分類7.x-3.x-dev(2012-abr-29)
  • ドメインビュー7.x-1.5
  • 埋め込みビュー表示7.x-1.2
  • エンティティAPI 7.x-1.2
  • エンティティリファレンス7.x-1.0
  • IMCE 7.x-1.7
  • IMCE Mkdir 7.x-1.0
  • 国際化7.x-1.10
  • リンク7.x-1.1
  • ローカリゼーション更新7.x-1.0-beta3
  • メディア7.x-1.3
  • メタタグクイック7.x-2.7
  • ニュースレター7.x-1.0-beta9
  • オプション要素7.x-1.9
  • ページスタイル7.x-1.0
  • パネル7.x-3.3
  • Pathauto 7.x-1.2
  • 病理7.x-2.11
  • profile2 7.x-1.3 + 0-dev(2013-mai-24)
  • select_or_other 7.x-2.19
  • sheetnode 7.x-1.0-beta4 + 3-dev(2013-mai-25)
  • SMTP認証サポート7.x-1.0
  • トークン7.x-1.5
  • 文字変換7.x-3.1
  • 変数7.x-2.3
  • ビュー7.x-3.7
  • ロール7.x-1.0ごとの語彙パーミッション
  • Webform 7.x-3.19
  • Webform Validation 7.x-1.2
  • ワークベンチ7.x-1.2
  • workbench_access 7.x-1.2
  • workbench_media 7.x-1.1
  • workbench_profile 7.x-1.1
  • xmlsitemap 7.x-2.0-rc2

私のサイトはシンプルで、訪問者は多くありません。たぶん1日500人ぐらいの話をしている。 Drupalは、CPUに大きな負荷をかける可能性がありますか?またはモジュール?

その他の問題はメモリ使用量です。プロセスが作成されると、80MがApache2に割り当てられます。多すぎると思います。

私の問題は、CPU(すべてのコア)の負荷が高いことです。ほとんどの場合、90%から100%の負荷に達しています!問題のプロセスはApache2です。記憶はまた哀れなく消費されます。合計8GBのうち、消費されるメモリは約6.5GBから7.5GBです。私のApache設定が間違っているのか、それとも本当にもっとハードウェアが必要なのかはわかりません(私はそうは思いません)。 Drupalは高いCPU負荷を引き起こす可能性がありますか?

CPU負荷が100%に達すると、サイトがダウンし、Apacheを再起動する必要があります。 Drupal APCを使用してBoostをインストールすることで回避策を実行しました。ある程度の効果はありましたが、CPUの負荷はまだ高く、非常に高いです。

DrupalモジュールやPHP拡張機能などのように、さらに情報が必要な場合はお知らせください。

5
Ricardo Giaviti

その他の問題はメモリ使用量です。プロセスが作成されると、80MがApache2に割り当てられます。多すぎると思います。

それは実メモリですか、それとも仮想メモリですか?正直なところ、それほどではありません。もっと重要なことは、問題を引き起こしているものを修正することに焦点を当てるべきであり、「考える」ことが異なるものだけではありません。

Apacheプロセスで使用するメモリを少なくしたい場合は、モジュールを無効にする必要があります(各モジュールはメモリに配置する必要のあるコードが多いため)。しかし、有効にしたすべてのモジュールが必要な場合は、それだけです。

メモリに制約のあるマシンを管理する際に使用したアプローチの1つは、特定のタスクをApacheから他のサーバーに移動することで、個別に調整できるようにしました。

しかし、はるかに簡単なアプローチは変更することです

MaxClients           120

ワークロードに適したものに:

書き換えアクセスとメインサイトのトラフィックを考慮すると、1分あたり約70のリクエストがあります。現在、33の着信接続があります。

すぐに戻りますが、33の同時リクエストしか処理しない場合は、120ワーカーは必要ありません。

MaxClients           40

また、MinSpareServersMaxSpareServerをそれぞれ5と10のように調整する必要があります。 30人の労働者が何もせずに座っている必要はありません。

今、に戻って

書き換えアクセスとメインサイトのトラフィックを考慮すると、1分あたり約70のリクエストがあります。現在、33の着信接続があります。

33の同時リクエストがあり、1分あたり70しか実行していない場合、いくつかの可能性があります。

  1. リクエストが処理されるまでに約30秒かかります。
  2. リクエスト率はあまり安定しておらず、ほとんどの場合、何もしていません。

#1が当てはまる場合、私は助ける方法が本当にわかりません-何かが信じられないほど間違っているので、どこから見ればよいのかわかりません。

#2の場合、サーバーからすべての静的アセット(画像、js、css、フォント)を提供していると思います。これらをCDNに配置することをお勧めしますが、本当にそれができない場合は、非常に長いキャッシュ時間を設定してVarnishをオンに戻すことができます。 PHPと他のホスト全体で静的ファイルを提供するためだけにApacheプロセスを使用している場合、リソースを無駄にしていることになります。もっと簡単な方法でそれを実行してください!

私の問題は、CPU(すべてのコア)の負荷が高いことです。ほとんどの場合、90%から100%の負荷に達しています。問題のプロセスはApache2です。

これは定数ですか、それともリクエストを処理するときだけですか?

ディスクI/Oはどのように見えますか(iostat -mhx 2)? MySQLは何をしていますか(show processlist;)?


あなたのサーバーはあなたが説明したものに対して非常に強力です。これは、この問題を修正できるはずなので、朗報です。

私は同じ問題に直面しました。 Webコンテンツをローカルマシンにダウンロードし、更新されたアンチウイルスでコンテンツをスキャンします。私の場合、犯人はトロイの木馬ウイルスです。 Webコンテンツのウイルスを駆除した後、私の問題は解決しました。

0
Hari prabaharan