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

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,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/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>
            久久久久成人精品免费播放动漫| 欧美中文在线免费| 亚洲精品久久久久久久久久久久| 日韩视频亚洲视频| 国产乱码精品一区二区三区五月婷| 久久资源在线| 国产一区二区视频在线观看| 亚洲精品永久免费| 一区二区三区四区精品| 亚洲美女尤物影院| 亚洲天堂免费观看| 欧美日韩久久精品| 午夜在线精品偷拍| 亚洲美女在线看| 久久久久久久综合色一本| 亚洲日本中文字幕区 | 亚洲综合日韩在线| 国产精品丝袜xxxxxxx| 欧美a级一区二区| 午夜精品久久99蜜桃的功能介绍| 久久综合色婷婷| 亚洲制服丝袜在线| 亚洲欧美国产一区二区三区| 免费成人av在线| 99视频国产精品免费观看| 久久国产精品亚洲77777| 亚洲精品精选| 亚洲国产精品va在线看黑人动漫| 国产精品a久久久久久| 欧美成人在线网站| 老色鬼久久亚洲一区二区| 亚洲欧美国产精品va在线观看| 欧美大片免费久久精品三p | 久久av免费一区| 午夜精品久久99蜜桃的功能介绍| 另类天堂视频在线观看| 久久成人在线| 久久久久久尹人网香蕉| 久久久久在线| 久久久国产精品一区二区三区| 亚洲欧美日韩综合| 亚洲自拍偷拍麻豆| 性色av香蕉一区二区| 午夜精品视频一区| 欧美一区二区视频在线观看| 亚洲网友自拍| 久久综合给合久久狠狠色| 久久人人爽人人爽| 亚洲国产另类精品专区| 亚洲大胆人体在线| 一区二区三区精品久久久| 日韩午夜在线视频| 欧美在线免费观看视频| 亚洲四色影视在线观看| 久久精品99久久香蕉国产色戒 | 欧美了一区在线观看| 国产伦精品一区二区三区照片91 | 久久精品视频在线| 欧美大香线蕉线伊人久久国产精品| 欧美顶级大胆免费视频| 一区二区日本视频| 免费久久精品视频| 欧美午夜电影网| 国产有码在线一区二区视频| 在线看一区二区| 久久国产黑丝| 亚洲性视频网站| 欧美日韩国产系列| 亚洲毛片在线| 欧美激情一二三区| 久久久女女女女999久久| 国产精品美女久久久久久免费| 亚洲精品视频在线| 亚洲欧洲日韩女同| 欧美影院在线| 在线看日韩av| 两个人的视频www国产精品| 午夜视频一区| 国产一区二区看久久| 久久久久国产精品一区| 欧美电影在线观看完整版| 久久一日本道色综合久久| 国精品一区二区三区| 久久青草欧美一区二区三区| 欧美一区二区三区电影在线观看| 国产日本亚洲高清| 久久久亚洲人| 欧美国产日韩亚洲一区| 国产精品99久久久久久www| 夜夜嗨网站十八久久| 国产精品免费视频观看| 午夜一区二区三区不卡视频| 亚洲欧美第一页| 亚洲国产精品123| 日韩视频在线观看一区二区| 国产日韩专区| 亚洲精品婷婷| 国产婷婷一区二区| 亚洲福利在线看| 国产毛片一区| 亚洲激情自拍| 国内精品模特av私拍在线观看| 欧美jizz19hd性欧美| 欧美亚洲成人网| 亚洲第一在线综合网站| 国产一区二区三区在线播放免费观看| 美国成人直播| 国产精品video| 亚洲激情视频网| 亚洲成色www久久网站| 亚洲欧美日韩综合| 亚洲天堂av在线免费| 欧美—级a级欧美特级ar全黄| 久久久综合激的五月天| 国产精品毛片大码女人| 美日韩精品免费观看视频| 国产精品久久亚洲7777| 9i看片成人免费高清| 夜夜嗨av一区二区三区四区 | 国产精品美女| 亚洲色图综合久久| 亚洲欧美日韩综合国产aⅴ| 免费欧美高清视频| 亚洲电影免费观看高清完整版在线 | 欧美一区二区在线看| 国产一区深夜福利| 亚洲一区精品视频| 亚洲欧美另类在线观看| 国产欧美日韩一区二区三区| 亚洲视频中文字幕| 久久女同精品一区二区| 在线观看欧美视频| 欧美人与性动交α欧美精品济南到| 亚洲国产精品福利| av不卡在线观看| 国产精品一区二区你懂的| 亚洲欧美成人网| 亚洲激情在线| 久久久久九九九| 日韩视频精品| 狠狠干综合网| 欧美片网站免费| 久久亚洲春色中文字幕| 亚洲精品一区二区三区99| 欧美在线视频免费| 亚洲福利视频二区| 国产精品久久久久婷婷| 久久久国产精品一区二区中文| 91久久精品美女高潮| 久久久国产成人精品| 一区二区三区免费网站| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美成人黑人xx视频免费观看| 一本在线高清不卡dvd| 最新国产成人在线观看| 久久一本综合频道| 久久国产精品色婷婷| 亚洲综合首页| 日韩系列在线| 亚洲精品永久免费| 日韩一级片网址| 在线免费观看视频一区| 狠狠狠色丁香婷婷综合久久五月| 国产精品久久精品日日| 欧美亚州在线观看| 欧美日韩一区二区三区在线 | 宅男精品视频| 亚洲欧美大片| 亚洲欧美三级伦理| 欧美亚洲免费在线| 久久久99免费视频| 久久综合久久88| 亚洲精品国产无天堂网2021| 一本色道久久综合亚洲精品不| 9色精品在线| 亚洲欧美网站| 免费人成网站在线观看欧美高清| 久热爱精品视频线路一| 欧美日韩高清在线播放| 国产精品久久久久久久久久ktv | 国产毛片久久| 玖玖玖国产精品| 欧美三级中文字幕在线观看| 国产精品一区二区你懂得| 国产深夜精品福利| 亚洲日本中文字幕免费在线不卡| 亚洲资源在线观看| 免费国产自线拍一欧美视频| 亚洲精品综合精品自拍| 久久九九热re6这里有精品| 欧美午夜精品久久久久免费视| 国产一区二区三区久久精品| 亚洲最黄网站| 亚洲国产精品成人va在线观看| 亚洲免费视频网站| 欧美午夜精品一区| 一本大道久久a久久精二百| 欧美成人一区二区三区| 久久成人资源| 国产一区二区三区av电影|