青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

lighttpd1.4.18代碼分析(五)--處理超時連接

本節相對簡單, 講講lighttpd中如何處理超時的連接.
方法很簡單, lighttpd創建一個每隔一秒觸發的定時器, 被觸發后查找當前的所有連接, 看它們的時間是否已經超過了最長的生存期, 如果是就關閉連接.

創建定時器的代碼在server.c的main函數中:
#ifdef USE_ALARM
    
struct itimerval interval;

    interval.it_interval.tv_sec 
= 1;
    interval.it_interval.tv_usec 
= 0;
    interval.it_value.tv_sec 
= 1;
    interval.it_value.tv_usec 
= 0;
#endif


#ifdef USE_ALARM
    
// 定時
    signal(SIGALRM, signal_handler);

    
/* setup periodic timer (1 second) */
    
if (setitimer(ITIMER_REAL, &interval, NULL)) {
        log_error_write(srv, __FILE__, __LINE__, 
"s""setting timer failed");
        
return -1;
    }

    getitimer(ITIMER_REAL, 
&interval);
#endif
定時器觸發的時候產生ALARM信號,此時在服務器主循環中輪詢所有的連接,這段代碼同樣在server.c的main函數中:
        // 如果產生了alarm信號 那么一秒鐘過去了
        if (handle_sig_alarm) {
            
/* a new second */

#ifdef USE_ALARM
            
/* reset notification */
            handle_sig_alarm 
= 0;
#endif

            
/* get current time */
            
// 獲得當前的時間
            min_ts = time(NULL);

            
// 如果當前時間不等于server上次記錄的時間
            if (min_ts != srv->cur_ts) {
                
int cs = 0;
                connections 
*conns = srv->conns;
                handler_t r;

                
switch(r = plugins_call_handle_trigger(srv)) {
                
case HANDLER_GO_ON:
                    
break;
                
case HANDLER_ERROR:
                    log_error_write(srv, __FILE__, __LINE__, 
"s""one of the triggers failed");
                    
break;
                
default:
                    log_error_write(srv, __FILE__, __LINE__, 
"d", r);
                    
break;
                }

                
/* trigger waitpid */
                
// 更新server的當前時間
                srv->cur_ts = min_ts;

                
/* cleanup stat-cache */
                
// 每秒清空一次stat cache
                stat_cache_trigger_cleanup(srv);
                
                
/**
                 * check all connections for timeouts
                 
*/
                
// 檢查所有連接是否已經超時
                for (ndx = 0; ndx < conns->used; ndx++) {
                    
int changed = 0;
                    connection 
*con;
                    
int t_diff;

                    con 
= conns->ptr[ndx];

                    
if (con->state == CON_STATE_READ ||
                        con
->state == CON_STATE_READ_POST) {
                        
if (con->request_count == 1) {
                            
// 如果當前時間與read_idle_ts之差大于max_read_idle, 超時
                            if (srv->cur_ts - con->read_idle_ts > con->conf.max_read_idle) {
                                
/* time - out */

                                connection_set_state(srv, con, CON_STATE_ERROR);
                                changed 
= 1;
                            }
                        } 
else {
                            
// 如果當前時間與read_idle_ts之差大于max_keep_alive_idle, 超時
                            if (srv->cur_ts - con->read_idle_ts > con->conf.max_keep_alive_idle) {
                                
/* time - out */

                                connection_set_state(srv, con, CON_STATE_ERROR);
                                changed 
= 1;
                            }
                        }
                    }

                    
if ((con->state == CON_STATE_WRITE) &&
                        (con
->write_request_ts != 0)) {
                        
// 如果當前時間與write_request_ts之差大于max_write_idle, 超時
                        if (srv->cur_ts - con->write_request_ts > con->conf.max_write_idle) {
                            
/* time - out */
#if 1
                            log_error_write(srv, __FILE__, __LINE__, 
"sbsosds",
                                    
"NOTE: a request for",
                                    con
->request.uri,
                                    
"timed out after writing",
                                    con
->bytes_written,
                                    
"bytes. We waited",
                                    (
int)con->conf.max_write_idle,
                                    
"seconds. If this a problem increase server.max-write-idle");
#endif
                            connection_set_state(srv, con, CON_STATE_ERROR);
                            changed 
= 1;
                        }
                    }
                    
                    
/* we don't like div by zero */
                    
// 如果接收連接的時間 = server當前時間
                    if (0 == (t_diff = srv->cur_ts - con->connection_start)) 
                        t_diff 
= 1;

                    
if (con->traffic_limit_reached &&            // 如果已經達到了傳輸的極限
                        (con->conf.kbytes_per_second == 0 ||    // 似乎這個值一直是0啊
                         ((con->bytes_written / t_diff) < con->conf.kbytes_per_second * 1024))) {    // 如果每秒發送的數據量小于kbytes_per_second * 1024
                        /* enable connection again */
                        
// 傳輸極限不再
                        con->traffic_limit_reached = 0;

                        changed 
= 1;
                    }

                    
// 如果狀態發生了改變, 那么進入狀態機進行處理
                    if (changed) {
                        connection_state_machine(srv, con);
                    }

                    con
->bytes_written_cur_second = 0;
                    
*(con->conf.global_bytes_per_second_cnt_ptr) = 0;

                }

                
if (cs == 1
                    fprintf(stderr, 
"\n");
            }
        }
        

需要注意的是, 由于lighttpd采用了這種方式處理超時連接, 會觸發大量的ALARM信號產生,在編碼的時候要特別注意被信號中斷的情況.


posted on 2008-09-05 19:33 那誰 閱讀(3413) 評論(1)  編輯 收藏 引用 所屬分類: 網絡編程服務器設計Linux/Unixlighttpd

評論

# re: lighttpd1.4.18代碼分析(五)--處理超時連接  回復  更多評論   

在程序中并沒有定義宏USE_ALARM,唯一的一處定義也被作者注釋掉了:
/*
* IRIX doesn't like the alarm based time() optimization
*/
/*
* #define USE_ALARM
*/
好像每次循環中
// 如果產生了alarm信號 那么一秒鐘過去了
if (handle_sig_alarm) {。。。
都會運行,因為handle_sig_alarm始終是1.
2010-03-18 22:24 | hcykernel
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            伊人久久婷婷色综合98网| 亚洲婷婷综合色高清在线 | 欧美日韩在线一二三| 欧美成人免费网站| 免费日韩av片| 欧美日韩一区精品| 国产精品一区二区你懂的| 国产免费成人| 18成人免费观看视频| 日韩视频免费观看| 亚洲欧美国内爽妇网| 久久久久久久波多野高潮日日| 久久久久一区二区三区| 欧美黄色大片网站| 亚洲视频1区2区| 老司机精品福利视频| 欧美体内谢she精2性欧美 | 这里只有精品电影| 欧美一二三视频| 免费成年人欧美视频| 99国产精品久久久久久久久久| 亚洲一区网站| 欧美大片在线看| 国产欧美日韩综合一区在线观看 | 亚洲一区视频| 亚洲午夜精品17c| 国产精品影音先锋| 亚洲国产精品成人综合| 99这里只有久久精品视频| 亚洲网站在线看| 久久精品视频在线| 亚洲精品一区二区三| 欧美在线观看视频在线| 欧美理论电影在线观看| 韩国一区电影| 亚洲欧美一区二区激情| 欧美激情视频一区二区三区不卡| 亚洲一区二区三区涩| 欧美刺激性大交免费视频 | 久久婷婷国产综合国色天香| 国产精品久久久久影院色老大| 亚洲第一黄网| 久久久www成人免费毛片麻豆| 亚洲精品在线视频观看| 免费成人性网站| 激情久久一区| 久久久国产精品亚洲一区| 亚洲最新中文字幕| 欧美激情一区二区三区| 在线欧美一区| 美女啪啪无遮挡免费久久网站| 亚洲性视频网站| 欧美天堂亚洲电影院在线播放| 日韩视频一区二区三区在线播放免费观看| 久久久精品一区| 午夜免费日韩视频| 国产精品一区二区三区久久久| 在线一区二区三区四区五区| 最新成人在线| 美女脱光内衣内裤视频久久网站| 伊人久久婷婷| 欧美激情亚洲自拍| 欧美成人免费在线视频| 亚洲精品久久久久久久久久久| 欧美aⅴ99久久黑人专区| 六月婷婷久久| 在线视频欧美一区| 一区二区国产在线观看| 国产精品成人v| 亚洲一区二区三区四区视频| 日韩午夜电影av| 国产精品欧美精品| 久久久久久免费| 久热成人在线视频| 亚洲天堂第二页| 亚洲欧美中日韩| 亚洲国产婷婷香蕉久久久久久99| 91久久久国产精品| 国产精品久久久久婷婷| 老鸭窝毛片一区二区三区| 免费亚洲一区二区| 亚洲一区二区黄色| 欧美影院在线播放| 小嫩嫩精品导航| 国产精品最新自拍| 一区二区亚洲精品国产| 亚洲欧美日韩在线不卡| 一区二区电影免费在线观看| 欧美久久婷婷综合色| 亚洲国产精品99久久久久久久久| 久久青青草原一区二区| 久久精品一二三区| 亚洲激情在线观看| 亚洲精品在线观看视频| 国产精自产拍久久久久久蜜| 久久偷看各类wc女厕嘘嘘偷窃| 另类成人小视频在线| 99这里只有久久精品视频| 亚洲性视频网址| 激情亚洲成人| 亚洲乱码视频| 国产午夜久久久久| 亚洲欧洲日本国产| 国产精品久久久久毛片软件| 久久久夜色精品亚洲| 欧美激情第五页| 久久精品理论片| 欧美日韩第一页| 欧美+日本+国产+在线a∨观看| 欧美日韩调教| 久久久久欧美| 国产精品久久久| 亚洲电影在线| 国内外成人免费激情在线视频网站| 亚洲国产精品成人精品| 国产在线精品自拍| 亚洲视频 欧洲视频| 日韩视频一区二区在线观看| 久久精品视频99| 性娇小13――14欧美| 欧美日韩精品福利| 免费欧美日韩| 国产一区二区三区成人欧美日韩在线观看| 欧美大片在线看免费观看| 国产综合在线看| 新狼窝色av性久久久久久| 亚洲无限av看| 欧美区一区二| 亚洲国产成人av| 伊人久久噜噜噜躁狠狠躁| 久久成人精品一区二区三区| 欧美一级二级三级蜜桃| 国产精品久99| 亚洲色图制服丝袜| 一级成人国产| 国产精品99免费看| 99re热这里只有精品免费视频| 亚洲乱码视频| 欧美日韩国产成人高清视频| 亚洲精品日韩一| 一本久道综合久久精品| 欧美高清在线一区| 久久av资源网站| 国产丝袜美腿一区二区三区| 亚洲欧美福利一区二区| 亚洲福利在线视频| 日韩视频免费观看| 欧美韩国日本一区| 亚洲国产精品va在线看黑人 | 欧美专区在线| 国产日韩一区| 久久久久在线| 亚洲国产日韩欧美一区二区三区| 亚洲国产欧美不卡在线观看| 欧美成人四级电影| 亚洲乱码国产乱码精品精98午夜| 亚洲性线免费观看视频成熟| 国产精品女主播在线观看| 欧美在线观看视频在线| 欧美成人首页| 亚洲一区二区三区精品视频| 国产精品日韩专区| 久久精品一区四区| 亚洲风情亚aⅴ在线发布| 一本一本久久a久久精品综合麻豆| 欧美日韩免费在线视频| 性一交一乱一区二区洋洋av| 欧美+日本+国产+在线a∨观看| 一本色道久久加勒比88综合| 国产日韩综合一区二区性色av| 美国成人直播| 亚洲男人第一网站| 欧美成黄导航| 性欧美大战久久久久久久久| 亚洲国产一区二区三区青草影视| 欧美香蕉视频| 欧美**人妖| 亚洲一区二区少妇| 亚洲国产精品久久久久婷婷884| 香蕉久久精品日日躁夜夜躁| 亚洲第一精品在线| 国产精品毛片一区二区三区| 麻豆av一区二区三区久久| 亚洲专区免费| 亚洲精品国产精品乱码不99| 久久精品一区二区三区不卡牛牛| 亚洲精品日韩在线观看| 国内免费精品永久在线视频| 国产精品国码视频| 欧美成熟视频| 久久综合婷婷| 午夜精品久久久久久久久久久久 | 免播放器亚洲一区| 欧美亚洲专区| 亚洲一区二区毛片| 91久久久久久国产精品| 国产一区二区三区日韩欧美| 欧美视频免费看| 欧美大秀在线观看| 久久亚洲一区二区|