0

最近、共有ホストから専用ホストに切り替えて、より多くの監視/制御が可能になりました。切り替える前からメモリ使用量が非常に多いという問題をデバッグしようとしています。Instagram フィード/API へのサブスクリプションである特定のスクリプトに絞り込んだと思います。これは codeIgniter フレームワークで動作します。

これは私のプロセスのスクリーンショットです。非常に高い httpd メモリ値に注意してください ここに画像の説明を入力

これがcodeIgniterのコントローラーです

class Subscribe extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->instagram_api->access_token = 'hidden';
    }
    function callback()
    {

    //echo anchor('logs/activity.log', 'LOG');
$min_id = ''; 
$next_min_id = '';      

$this->load->model('Subscribe_model');
$min_id = $this->Subscribe_model->min_id();

echo $min_id;

    $pugs = $this->instagram_api->tagsRecent('tagg','',$min_id);
    if($pugs){
    if (property_exists($pugs->pagination, 'min_tag_id')) {
            $next_min_id = $pugs->pagination->min_tag_id;
        }   
    foreach($pugs as $pug) {
        if(is_array($pug)) {     
            foreach($pug as $media) { 
                $url = $media->images->standard_resolution->url;
                $m_id = $media->id;
                $c_time = $media->created_time;
                $user = $media->user->username;
                $filter = $media->filter;
                $comments = $media->comments->count;
                $caption = $media->caption->text;
                $link = $media->link;
                $low_res=$media->images->low_resolution->url;
                $thumb=$media->images->thumbnail->url;
                $lat = $media->location->latitude;
                $long = $media->location->longitude;
                $loc_id = $media->location->id;
                $date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));

                $data = array(
                   'media_id' => $m_id,
                   'min_id' => $next_min_id,
                   'url' => $url, 
                   'c_time' => $c_time,
                   'user' => $user,
                   'filter' => $filter,
                   'comment_count' => $comments,
                   'caption' => $caption,
                   'link' => $link, 
                   'low_res' => $low_res,
                   'thumb' => $thumb,
                   'lat' => $lat,
                   'long' => $long,
                   'loc_id' => $loc_id,
                );
                $this->Subscribe_model->add_pug($data);

            }

        }

    }
    }

そしてここにモデルがあります....

class Subscribe_model extends CI_Model {

    function min_id(){

        $this->db->order_by("c_time", "desc");      
        $query = $this->db->get("pugs");

        if ($query->num_rows() > 0)
        {
           $row = $query->row(); 
           $min_id = $row->min_id;
           if(!$min_id){
            $min_id ='';
           }
        }   

        return $min_id;

    }

    function add_pug($data){

        $query = $this->db->get_where('pugs', array('media_id'=>$data['media_id']));
        if($query->num_rows() > 0){
            return FALSE;   
        }else{
            $this->db->insert('pugs', $data);   
        }

    }
}

//============================編集================== =====//

一部のサービスを fast-cgi に変換したところ、メモリ使用量が大幅に減少したように見えますが、CPU の増加に気付きました。専用サーバーに切り替えることで頭痛がはるかに少なくなり、物事がはるかに簡単になることを望んでいましたが、これまでのところ悪夢でした. 私は噛むことができないほど噛んでしまったのではないかと心配しています。

私のもう 1 つの懸念は、サーバーにドメイン名を追加することです。最後の画像で実行されている複数のphp-cgiのように、非常に高速に実行される新しいプロセスを追加しますか?

これが私の最近の出力です... ここに画像の説明を入力 ここに画像の説明を入力

4

1 に答える 1

0

本当のメモリ リークがないことを確認するには、サーバー上で httpd/myslqd だけを実行し (killall Xorg / telinit 3)、前述の 2 つのサービスを停止します。からの出力を書き留めますfree|grep Mem |sed 's/\([^0-9]*[^\ ]*\)\{3\}\([^\ ]*\).*/\1/'。これは RAM の X 空きバイトです。ここで、httpd/mysqld サービスを開始し、数百のリクエストに対して実行します。サービスを停止し、数値を書き留めて、中央値の結果に満足するまで繰り返します。

httpd が大量の RAM を消費することは珍しくありません。また、mysqld はメモリ内にキャッシュします。これは単純に、同じリクエストが連続して (連続して) 発生した場合、静的キャッシュは既にバッファリングされており、使用できる状態になっているためです。

PHP の場合、クラスは事前にコンパイルされており、システムが最初のコンパイル後に必要になると、スクリプトを行ごとに解釈する必要がなくなり、バイトコードでエンコードされたオブジェクトが処理されます。fstat.mtime > bytecode.mtime. の場合、コンパイルはもちろん再コンパイルされます。

次のコマンドを使用して、スワップされていない実メモリの使用状況を分析できます。

ps -ylC httpd --sort:rss

静的ファイルを提供するための子プロセスのサイズは、約 2 ~ 3M です。PHP などの動的コンテンツの場合、約 15M になる場合があります。

Apache がワーカーを設定する方法を設定するには、httpd.conf で次のパラメータが有効です。

StartServers, 
MaxClients, 
MinSpareThreads, 
MaxSpareThreads, 
ThreadsPerChild, 
MaxRequestsPerChild 

このリンクを確認してください: http://www.howtoforge.com/configuring_apache_for_maximum_performance

セクション 3.5:

MaxClients は、サーバーがサポートできる最大同時リクエストの制限を設定します。この数を超える子プロセスは生成されません。新しい接続がキューに入れられ、最終的にタイムアウトになり、サーバー リソースが使用されないままになるような低すぎる設定は避けてください。これを高く設定しすぎると、サーバーがスワッピングを開始し、応答時間が大幅に低下します。MaxClients の適切な値は次のように計算できます: MaxClients = Web サーバー専用の RAM の合計 / 子プロセスの最大サイズ

Apache のパフォーマンス チューニングはhttp://httpd.apache.org/docs/2.0/misc/perf-tuning.htmlで利用できます。上記の構成オプションの詳細については、プロセスの作成に関するセクションまでスキップしてください。

于 2012-06-18T03:58:37.570 に答える