Swooleノート(五)

8438 ワード

構成の説明

$server->set(array(
	'daemonize' => true,
	'log_file' => '/www/log/swoole.log',
	'reactor_num' => 2,
	'worker_num' => 2,
	'task_worker_num' => 4,
	'max_request' => 100,
	
));

daemonize


バックグラウンドで実行するかどうかを設定します.デフォルトはfalseです.daemonize => 1を設定すると、プログラムはバックグラウンドに移行してデーモンとして実行されます.長時間実行されるサーバ・エンド・プログラムは、このオプションを有効にする必要があります.
デーモンプロセスが有効でない場合、ssh端末が終了すると、プログラムは実行を終了します.
注意:
  • デーモンが有効になると、標準入力と出力がlog_にリダイレクトされます.file.
  • log_が設定されていない場合fileは、/dev/nullにリダイレクトされ、すべての印刷画面の情報が破棄されます.

  • log_file


    swooleエラーログファイルを指定します.swoole実行中に発生した異常情報がこのファイルに記録されます.デフォルトでは画面に印刷されます.
    注意log_fileは自動的にファイルを分割しないので、定期的にファイルをクリーンアップする必要があります.ログを再オープンすることで、ログを1日単位で記録できます.

    log_level


    swoole_の設定serverエラーログ印刷のレベルは0-5です.logより低いレベル設定のログ情報は放出されません.デフォルトは0です.つまり、すべてのレベルで印刷されます.
    0 =>DEBUG
    1 =>TRACE
    2 =>INFO
    3 =>NOTICE
    4 =>WARNING
    5 =>ERROR
    

    reactor_num


    reactorスレッド数は、マルチコアを十分に利用するために、メインプロセス内のイベント処理スレッドの数を調整します.CPUコア数が同じ数になるのはデフォルトです.reactor_numは一般にCPUコア数の1〜4倍に設定され、swooleではreactor_numが最大CPU *4を超えてはならない.
    Swooleのメインプロセスはマルチスレッドのプログラムです.Reactorスレッドと呼ばれる重要なスレッドのセットがあります.TCP接続を本格的に処理し、データを送受信するスレッドです.Reactorスレッドはプロトコル解析を行い,要求をWorkerプロセスに配信する.
    推奨構成:CPUコア数.
    注意:reactor_numは、worker_num以下である必要があります.設定されたreactor_numworker_numより大きい場合、swooleはreactor_numworker_numに等しくなるように自動的に調整します.

    worker_num


    起動したworkerプロセスの数を設定します.worker_num >= 1、少なくとも1つ、デフォルトは1です.設定方法:
  • トラフィックコードは全非同期非ブロックであり、ここではCPUの1〜4倍に設定するのが最も合理的である.
  • トラフィックコードは同期ブロックであり、要求応答時間とシステム負荷に応じて調整する必要がある.

  • 例えば、1つの要求に100 msを費やし、1000 QPSの処理能力を提供するには、100プロセス以上を構成する必要があります.ただし、メモリの消費量を考慮する必要があります.各プロセスが40 Mメモリを消費すると仮定すると、100プロセスが4 Gメモリを消費する必要があります.
    推奨構成:CPUコア数*2.

    task_worker_num


    taskプロセスの数を構成します.このパラメータを構成するとtask機能が有効になります.ビジネスが非同期タスクを使用できない場合は、設定しないことができます.サブパラメータを設定すると、onTask/onFinish個のイベントコールバックを設定する必要があります.
    注意:
  • taskプロセスではswoole_server->taskメソッド
  • は使用できません.
  • taskプロセス内ではmysql-async/redis-async/swoole_event等の非同期IO関数
  • は使用できない.
    推奨構成:実際の非同期タスクの比重に基づいて設定します.

    dispatch_mode


    パケット配布ポリシー.3種類のタイプを選択できます.デフォルトは2です.一般的に、HttpServerは1、3を使用できます.WebSocketServerでは、デフォルトの2を使用できます.
  • 1、ループモード、ループが各workerプロセスに割り当てられることを受信します.
  • 2、固定モード、接続されたファイル記述子に基づいてworkerを割り当てます.これにより、同じ接続から送られてきたデータが同じworkerでしか処理されないことを保証できます.
  • 3,プリエンプトモードでは,メインプロセスはWorkerのビジー状態に応じて配達を選択し,アイドル状態のWorkerにのみ配達する.
  • 4,IP割り当ては、クライアントIPに基づいて型取りhashを行い、固定的なworkerプロセスに割り当てられる.同じソースIPの接続データが常に同じworkerプロセスに割り当てられることを保証できます.アルゴリズムはip2long(ClientIP) % worker_numです.
  • 5、UID割り当ては、$serv->bind()を呼び出して1つの接続を1つのuidにバインドする必要がある.その後、swooleはUIDの値に応じて異なるworkerプロセスに割り当てられます.アルゴリズムはUID % worker_numであり、UIDとして文字列を使用する必要がある場合はcrc32(UID_STRING)を使用することができる.
  • dispatch_mode BASEモードでの構成は無効です.BASEには配達タスクが存在しないためです.

    max_request


    workerプロセスの最大タスク数を設定します.デフォルトは0です.
    このパラメータの主な役割はPHPプロセスのメモリオーバーフローの問題を解決することである.1つのworkerプロセスがmaxを超えて処理されます.リクエスト値のタスクは自動的に終了し、プロセスが終了するとすべてのメモリとリソースが解放されます.
    たとえば3に設定すると、2つのworkerプロセスがあり、5回のリクエストを実行すると、必ず1つのworkerプロセスが終了し、新しいものが再プルされます.設定しないと、この操作は実行されません.
    PHPアプリでは遅いメモリリークがありますが、特定の原因に特定できず、解決できません.max_を設定することでrequest解決.
    コードにメモリ漏洩の問題がなく、アクセスするたびにメモリが少し増えていない場合は、設定しない(デフォルトは0)メモリ漏洩はありません.逆にmax_requestは、メモリの無制限な増加を制限し、メモリの漏洩を防止します.(参考)http://group.swoole.com/question/106049)

    task_max_request


    max_に似ていますrequest、デフォルトは5000です.taskプロセスの最大タスク数を設定します.taskプロセスは、この数値を超えるタスクを処理すると自動的に終了します.このパラメータはPHPプロセスのメモリオーバーフローを防止するためです.プロセスを自動的に終了しない場合は、0に設定します.

    max_conn (max_connection)


    サーバ・プログラム、max_などの最大許容接続数conn=>10000.このパラメータは、サーバが最大でどのくらいのtcp接続を維持できるかを設定するために使用されます.この数を超えると、新しく入力した接続は拒否されます.
  • のデフォルト値はulimit -nです.システムのulimit -nは小さすぎて、手動で設定する必要があります.例えばulimit -n 65535.
  • は、オペレーティングシステムulimit -nの最大値を超えてはならない.そうしないと、警告メッセージが表示され、ulimit -nの値にリセットされます.
  • このパラメータは、あまり大きく調整しないで、マシンメモリの実際の状況に応じて設定します.

  • heartbeat_idle_time、heartbeat_check_interval


    heartbeat_idle_timeとheartbeat_check_intervalを組み合わせて使用します.接続が最大アイドルを許可する時間を表します.次のようになります.
    array(
        'heartbeat_idle_time' => 600, // 
        'heartbeat_check_interval' => 60, // 
    );
    

    60秒ごとに繰り返されることを示します.600秒以内にサーバにデータが送信されない場合、接続は強制的に閉じられます.
  • heartbeatを有効にするidle_time後、サーバはクライアントにパケットを自発的に送信するのではなく、クライアントが心拍数を送信するのを受動的に待つ.
  • heartbeatのみが設定されている場合idle_timeはheartbeat_を設定していませんcheck_intervalの下部には心拍検出スレッドは作成されず、PHPコードではheartbeatメソッドを呼び出してタイムアウトした接続を手動で処理できます.

  • open_eof_check、package_eof


    EOF文字列を設定します.package_eofは最大8バイトの文字列のみを許可します.
    array(
        'open_eof_check' => true, // EOF 
        'package_eof' => "\r
    ", // EOF )

    EOF検出をオンにすると、クライアント接続から送信されたデータが検出され、パケットの最後に指定された文字列がある場合にWorkerプロセスに送信されます.それ以外の場合、キャッシュ領域を超えるかタイムアウトするまでパケットは接続されません.エラーが発生すると、swooleの最下位層は悪意のある接続とみなされ、データを破棄し、接続を強制的に閉じます.
    一般的なMemcache/STMTP/POPなどのプロトコルはすべてrで終了し、この構成を使用することができます.オンにすると、Workerプロセスが常に1つ以上の完全なパケットを一度に受信することを保証できます.

    open_eof_split


    EOF検出は、データの間からeof文字列を検索しないため、Workerプロセスは同時に複数のパケットを受信する可能性があり、アプリケーション層コードでexplode("\r
    ", $data)
    でパケットを分割する必要があります.
    1.7.15リリースでopen_が追加されましたeof_splitは、データからEOFを検索し、データを分割することをサポートします.

    pid_file


    サーバー起動時にマスタープロセスのPIDを自動的にファイルに書き込み、サーバー停止時にPIDファイルを自動的に削除します.(1.9.5+サポート)
    $server->set(array(
        'pid_file' => __DIR__.'/server.pid',
    ));
    

    その他のパラメータの詳細は、「コンフィギュレーションオプション-Swoole-Swooleドキュメントセンター」を参照してください.https://wiki.swoole.com/wiki/page/274.html

    サーバチューニング


    一般的な最適化パラメータ:
    #  
    ulimit -n 65535
    net.core.somaxconn = 262144
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_syncookies = 1
    
    # nginx 
    worker_rlimit_nofile 65535;
    use epoll;
    worker_connections 65535;
    keepalive_timeout 60;
    

    カーネル最適化はどのように修正するか:1、ulimitパラメータはulimit -SHn 65535を直接実行すればよく、ulimit -nを使用して表示することができる.2、その他のパラメータ最適化例:net.core.somaxconn対応ファイル/proc/sys/net/core/somaxconn:
    #  
    cat /proc/sys/net/core/somaxconn
    
    #  
    echo 65535 > /proc/sys/net/core/somaxconn
    
    net.ipv4.tcp_tw_recycle対応ファイル/proc/sys/net/ipv4/tcp_tw_recycle:
    #  
    cat /proc/sys/net/ipv4/tcp_tw_recycle
    
    #  
    echo 65535 > /proc/sys/net/ipv4/tcp_tw_recycle
    

    3、/etc/sysctl.confファイルを修正することもできます.
    #   IP  , 
    net.ipv4.ip_local_port_range = 2000 65000
     
    net.ipv4.tcp_window_scaling = 1
     
    #  , 
    net.ipv4.tcp_max_syn_backlog = 3240000
     
    #   socket  
    net.core.somaxconn = 3240000
    net.ipv4.tcp_max_tw_buckets = 1440000
     
    #   TCP  
    net.core.rmem_default = 8388608
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    net.ipv4.tcp_congestion_control = cubic
    
    # tcp 
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_tw_reuse = 1
    

    構成を変更した後、次のコマンドを有効にする必要があります.
    sysctl -p /etc/sysctl.conf
    

    関連アプリケーション


    1、https://github.com/matyhtf/framework2、派生オープンソースプロジェクト-Swoole-Swooleドキュメントセンターhttps://wiki.swoole.com/wiki/page/p-open_source.html3、moell-peng/webim:PHP+Swoole実現の簡単なチャットルームhttps://github.com/moell-peng/webim

    リファレンス


    1、Server-Swoole-Swooleドキュメントセンターhttps://wiki.swoole.com/wiki/page/p-server.html 2、swoole_study/Swooleのプロセスモデルmd at master · szyhf/swoole_study https://github.com/szyhf/swoole_study/blob/master/Swooleのプロセスモデルmd