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

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,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 那誰 閱讀(3420) 評論(1)  編輯 收藏 引用 所屬分類: 網絡編程 、服務器設計 、Linux/Unix 、lighttpd

評論

# 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>
            久久女同互慰一区二区三区| 亚洲高清在线观看一区| 国产精品日韩欧美一区二区三区| 国产一区二区三区四区hd| 国产精品免费网站| 免费观看成人www动漫视频| 日韩一区二区久久| 国产婷婷色综合av蜜臀av| 欧美11—12娇小xxxx| 欧美巨乳波霸| 正在播放欧美一区| 久久综合电影一区| 欧美一区二区高清| 美国十次了思思久久精品导航| 亚洲免费视频在线观看| 美腿丝袜亚洲色图| 亚洲一区综合| 欧美成人蜜桃| 国产精品高清网站| 亚洲精品一区二区三区不| 一区二区亚洲欧洲国产日韩| 久久久久久久综合| 亚洲午夜av| 久久黄色级2电影| 久久久成人网| 亚洲高清在线播放| 亚洲国产成人精品久久| 欧美中文在线免费| 久久精品视频导航| 久久精品亚洲一区二区三区浴池| 欧美极品在线观看| 榴莲视频成人在线观看| 日韩一区二区免费高清| 欧美高清在线播放| 国产精品美女久久久久久2018| 亚洲欧洲日产国码二区| 欧美午夜理伦三级在线观看| 日韩视频亚洲视频| 久久久久久国产精品mv| 精品99一区二区| 亚洲国产精品高清久久久| 亚洲综合99| 午夜精品免费视频| 免播放器亚洲一区| 9l国产精品久久久久麻豆| 国产精品久久午夜| 欧美国产综合视频| 好看不卡的中文字幕| 亚洲一区二区三区久久| 久久人人爽人人爽| 一个色综合导航| 亚洲欧洲在线一区| 国产日韩欧美不卡在线| 99精品视频免费| 国产一区二区三区在线播放免费观看 | 亚洲视频免费在线| 国产精品久久国产愉拍| 日韩香蕉视频| 亚洲第一综合天堂另类专| 性欧美1819性猛交| 一区二区三区四区五区精品| 欧美日韩大片| 欧美人妖在线观看| 欧美日韩亚洲一区三区| 亚洲欧美99| 亚洲香蕉成视频在线观看| 一色屋精品亚洲香蕉网站| 国产亚洲欧洲997久久综合| 欧美伊人久久| 免费不卡在线观看av| 亚洲日韩第九十九页| 欧美日韩中字| 亚洲二区精品| 欧美电影免费观看| 欧美久久久久久久久| 国产精品国产三级欧美二区| 卡一卡二国产精品| 欧美日韩国产一中文字不卡| 欧美午夜片欧美片在线观看| 乱人伦精品视频在线观看| 悠悠资源网久久精品| 国内一区二区三区在线视频| 激情综合五月天| 日韩亚洲在线观看| 欧美激情精品久久久六区热门| 欧美激情在线狂野欧美精品| 欧美体内she精视频| 亚洲日韩成人| 在线视频你懂得一区二区三区| 91久久精品美女高潮| 免费看亚洲片| 亚洲精品视频免费观看| 欧美激情小视频| 亚洲美女少妇无套啪啪呻吟| 伊人成年综合电影网| 亚洲国产裸拍裸体视频在线观看乱了中文 | 亚洲永久视频| 亚洲天堂免费在线观看视频| 老司机午夜免费精品视频| 亚洲欧美欧美一区二区三区| 亚洲国产中文字幕在线观看| 亚洲视频欧美在线| 欧美激情综合在线| 久久久久久**毛片大全| 欧美日韩免费观看一区| 亚洲欧美网站| 国产午夜一区二区三区| 久久国产精品久久久| 久久亚洲不卡| 欧美视频一区在线观看| 久久精品国产亚洲一区二区三区| 久久夜色精品国产欧美乱| 理论片一区二区在线| 国产婷婷色一区二区三区在线| 久久婷婷色综合| 国产精品你懂的在线| 亚洲美女在线观看| 亚洲视频碰碰| 亚洲一区二三| 国模 一区 二区 三区| 欧美99久久| 久久婷婷蜜乳一本欲蜜臀| 国产美女在线精品免费观看| 亚洲欧美日韩精品| 久久福利毛片| 狠狠88综合久久久久综合网| 久久久久久久综合狠狠综合| 亚洲一区二区av电影| 一本久道久久久| 欧美一区二区三区在| 欧美一区永久视频免费观看| 亚洲国产精品久久久久婷婷老年| 久久久精品动漫| 蜜臀久久99精品久久久画质超高清| 亚洲狼人综合| 在线观看欧美日韩| 久久亚洲美女| 久久精品一区四区| 美女国产一区| 一区二区三区四区五区在线| 国产精品腿扒开做爽爽爽挤奶网站| 午夜精品福利视频| 久久久久久久波多野高潮日日| 日韩亚洲视频| 国产一区二区三区最好精华液| 欧美精品免费播放| 午夜精品久久久久99热蜜桃导演| 亚洲国产精品成人综合| 欧美日韩在线一区二区三区| 久久成人18免费观看| 亚洲免费久久| 亚洲国产成人在线| 免费国产一区二区| 欧美国产激情| 蜜桃av综合| 免费av成人在线| 美女脱光内衣内裤视频久久网站| 亚洲一区二区久久| 国产精品99久久久久久久久久久久| 亚洲另类一区二区| 亚洲免费视频中文字幕| 亚洲欧美国产日韩天堂区| 亚洲欧美日韩成人高清在线一区| 一区二区三区国产| 亚洲成色www久久网站| 一区二区激情| 99re热这里只有精品免费视频| 男女精品网站| 日韩亚洲一区二区| 99re热这里只有精品视频 | 亚洲男人第一网站| 久久一区二区三区av| 欧美久久久久久| 欧美人与性动交cc0o| 欧美激情在线有限公司| 国产精品亚洲成人| 狠狠干狠狠久久| 樱桃视频在线观看一区| 亚洲午夜精品福利| 香蕉免费一区二区三区在线观看| 久久影院亚洲| 日韩亚洲在线| 亚洲欧洲精品一区| 久久久久久久性| 国产精品福利在线观看| 加勒比av一区二区| 亚洲精品国产精品久久清纯直播| 欧美一区二区三区四区在线| 开心色5月久久精品| 亚洲视频高清| 国产精品分类| 亚洲精品一级| 亚洲精品一二| 久久精品视频在线观看| 亚洲国产欧美日韩精品| 久热综合在线亚洲精品| 国产欧美日韩视频一区二区三区| 久久久综合香蕉尹人综合网| 亚洲福利视频一区二区| 麻豆精品视频在线观看|