非同期マルチスレッドC/Sフレームgko_pool


前の会社でイントラネットP 2 Pの転送ツールの名前を作っていました。当時は料理があまりにも多くて、ネット部分の書き方が悪くて、各種のブロック通信が退職しました。memcachedのコードを調べてみました。中のネットワークモデルはとても進歩していると感じました。memcachedのネット部分を抽出して、gingkoと結合しました。ネットフレームをgkoといいます。pool
大体の特性は:
  • 完全非同期化(DNS解析を含む)
  • は、listenポートをserverとしても良いし、アクティブに接続を開始してclient
  • を書くこともできます。
  • ウォーカーは、ピアのマルチスレッド
  • である。
  • は簡単な「メモリプール」を内蔵しています。
    コードを見て、memcached状態マシンに論理的なバグがあることを発見しました。 ついでにmemcachedにpatchを提出しましたが、このことは忘れられました。2年後に保護者に発見されました。メンテナはこう言いました。
    Wow,two years old…and it look s corect to me.If that udate_event fail s the connection might zombie.It's very hard for that to fail and it's been that way forever.Pused a comit for the next release.
    ところで、Memecachedはマルチスレッド非同期ネットワークプログラムの一つの大きな碑であると言っても過言ではありません。
    私はmemcachedのネット部分を抽出して、gko_というネットフレームに書きました。poolhttps://github.com/auxten/gko_pool
    栗を挙げます。httpブラシは私のノートパソコンの仮想マシンでも300 KQPSに達することができます。速度を制御して、うっかりしてsinaのサーバーを切ってしまいました。
    /*
     *
     *  Created on: May 18, 2012
     *      Author: auxten
     */
    #include "gko.h"
    #include <sys/time.h>
    /// gingko global stuff
    s_gingko_global_t gko;
    
    pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
    int cnt = 3;
    int counter = 0;
    void report_result(void * c, const char * msg)
    {
        GKOLOG(NOTICE, "%s", msg);
        pthread_mutex_lock(&lock);
        if (++counter == cnt)
        {
            printf("finished
    ");         exit(0);     }     pthread_mutex_unlock(&lock); } int main(int argc, char** argv) {     char cmd[2048];     gko.opt.to_debug = 0;     gko.ready_to_serv = 1;     gko.sig_flag = 0;     gko.opt.worker_thread = 8;     gko.opt.connlimit = SERV_POOL_SIZE; //    gko.opt.to_debug = 1;     gko_pool * gingko = gko_pool::getInstance();     gingko->setPort(-1);     gingko->setOption(&gko.opt); //    gingko->setProcessHandler(conn_send_data);     gingko->setReportHandler(report_result);     gingko->gko_run();     char ua[56][256] =     {     "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14",     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)",     "Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (Windows NT 6.1; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",     "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4",     "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0",     "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",     "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:16.0) Gecko/20100101 Firefox/16.0",     "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en]",     "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02",     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1",     "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)",     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)",     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)",     "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590)",     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",     "Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre",     "Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1",     "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4",     "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.289 Version/12.01",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25",     "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",     "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",     "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.92 Safari/537.4",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.14 (KHTML, like Gecko) Version/6.0.1 Safari/536.26.14",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1",     "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 Safari/536.25",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/5.0 (Windows NT 5.1; rv:16.0) Gecko/20100101 Firefox/16.0",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.79 Safari/537.4",     "Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3",     "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4",     "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101 Firefox/15.0.1",     "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b",     "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1",     "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1",     };     char srv[3][32] =     {         "202.108.43.189",         "202.106.182.237",         "home"     };     int i = cnt;     while (i--)     {         struct timeval tv;         gettimeofday(&tv, NULL);         long t = tv.tv_usec;         sprintf(cmd,                 "GET /Poll.php?project_id=5168&id=49 HTTP/1.%ld\r
    " //                "GET /Poll.php?project_id=5168&id=80 HTTP/1.%ld\r
    "                         "Host: hi.video.sina.com.cn\r
    "                         "User-Agent: %s\r
    "                         "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
    "                         "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r
    "                         "DNT: 1\r
    "                         "Client-IP: %ld.%ld.%ld.%ld\r
    "                         "Connection: keep-alive\r
    "                         "Referer: http://hi.video.sina.com.cn/you/2012banjiti/ph.php?dpc=1\r
    \r
    "                 , t % 2,ua[t % 56], 122 + t % 20, 121 + (i + t) % 128, 24 + (i + t) % 135, 24 + (i + t) % 213);         gingko->make_active_connect(srv[i%3], 80, strlen(cmd), cmd, -1, -1, 0, 10); //        gingko->make_active_connect("61.30.127.2", 80, strlen(cmd), cmd, -1, -1, 0, 10);     }     sleep(10); // , response,sleep     return 0; }
    私は切符を決済するために、こんなに多くのUserAgentを書きました。チケット業界の良心を利用します。ハハハ。
    その他の例、例えば、カスタムプロトコルのclient、serverなどはgithubに移行してください。
    このライブラリの安定性については、みなさんは質問しなくてもいいです。すでに当社のサーバー数万台のネットワークDaemenに使われています。