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

那誰(shuí)的技術(shù)博客

感興趣領(lǐng)域:高性能服務(wù)器編程,存儲(chǔ),算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評(píng)論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

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

本節(jié)相對(duì)簡(jiǎn)單, 講講lighttpd中如何處理超時(shí)的連接.
方法很簡(jiǎn)單, lighttpd創(chuàng)建一個(gè)每隔一秒觸發(fā)的定時(shí)器, 被觸發(fā)后查找當(dāng)前的所有連接, 看它們的時(shí)間是否已經(jīng)超過(guò)了最長(zhǎng)的生存期, 如果是就關(guān)閉連接.

創(chuàng)建定時(shí)器的代碼在server.c的main函數(shù)中:
#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
    
// 定時(shí)
    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
定時(shí)器觸發(fā)的時(shí)候產(chǎn)生ALARM信號(hào),此時(shí)在服務(wù)器主循環(huán)中輪詢所有的連接,這段代碼同樣在server.c的main函數(shù)中:
        // 如果產(chǎn)生了alarm信號(hào) 那么一秒鐘過(guò)去了
        if (handle_sig_alarm) {
            
/* a new second */

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

            
/* get current time */
            
// 獲得當(dāng)前的時(shí)間
            min_ts = time(NULL);

            
// 如果當(dāng)前時(shí)間不等于server上次記錄的時(shí)間
            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的當(dāng)前時(shí)間
                srv->cur_ts = min_ts;

                
/* cleanup stat-cache */
                
// 每秒清空一次stat cache
                stat_cache_trigger_cleanup(srv);
                
                
/**
                 * check all connections for timeouts
                 
*/
                
// 檢查所有連接是否已經(jīng)超時(shí)
                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) {
                            
// 如果當(dāng)前時(shí)間與read_idle_ts之差大于max_read_idle, 超時(shí)
                            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 {
                            
// 如果當(dāng)前時(shí)間與read_idle_ts之差大于max_keep_alive_idle, 超時(shí)
                            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)) {
                        
// 如果當(dāng)前時(shí)間與write_request_ts之差大于max_write_idle, 超時(shí)
                        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 */
                    
// 如果接收連接的時(shí)間 = server當(dāng)前時(shí)間
                    if (0 == (t_diff = srv->cur_ts - con->connection_start)) 
                        t_diff 
= 1;

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

                        changed 
= 1;
                    }

                    
// 如果狀態(tài)發(fā)生了改變, 那么進(jìn)入狀態(tài)機(jī)進(jìn)行處理
                    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采用了這種方式處理超時(shí)連接, 會(huì)觸發(fā)大量的ALARM信號(hào)產(chǎn)生,在編碼的時(shí)候要特別注意被信號(hào)中斷的情況.


posted on 2008-09-05 19:33 那誰(shuí) 閱讀(3409) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程服務(wù)器設(shè)計(jì)Linux/Unixlighttpd

評(píng)論

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

在程序中并沒(méi)有定義宏USE_ALARM,唯一的一處定義也被作者注釋掉了:
/*
* IRIX doesn't like the alarm based time() optimization
*/
/*
* #define USE_ALARM
*/
好像每次循環(huán)中
// 如果產(chǎn)生了alarm信號(hào) 那么一秒鐘過(guò)去了
if (handle_sig_alarm) {。。。
都會(huì)運(yùn)行,因?yàn)閔andle_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>
            国产精品亚洲第一区在线暖暖韩国 | 欧美亚洲在线观看| 欧美国产乱视频| 亚洲精品影院在线观看| a91a精品视频在线观看| 国模 一区 二区 三区| 亚洲国产一区二区三区青草影视 | 亚洲欧美清纯在线制服| 久久精品国产99| 亚洲午夜黄色| 久久亚洲午夜电影| 亚洲调教视频在线观看| 久久人体大胆视频| 欧美性一区二区| 极品尤物久久久av免费看| 欧美国产亚洲视频| 国产精品一区二区久久久久| 欧美成人嫩草网站| 国产老肥熟一区二区三区| 亚洲第一伊人| 国产亚洲欧美aaaa| 日韩写真在线| 亚洲国产成人久久| 亚洲欧美激情视频在线观看一区二区三区 | 亚洲伊人色欲综合网| 国产在线欧美日韩| 黄色免费成人| 亚洲人成毛片在线播放| 一区二区高清在线观看| 国产欧美一区二区三区另类精品| 香蕉久久夜色精品国产| 欧美一区二区女人| 国产精品私人影院| 久久偷看各类wc女厕嘘嘘偷窃| 久久久精品网| 亚洲欧美韩国| 欧美福利一区| 久久久久久久综合色一本| 欧美日本亚洲| 欧美成人亚洲成人| 国产午夜精品理论片a级探花 | 亚洲激情在线激情| 国产偷自视频区视频一区二区| 亚洲激情在线视频| 黄网站色欧美视频| 宅男精品视频| 亚洲美女尤物影院| 久久成人18免费观看| 亚洲欧美久久久久一区二区三区| 美日韩免费视频| 久久久久国产成人精品亚洲午夜| 欧美午夜精品久久久久免费视 | 亚洲女人av| 亚洲一区二区三区精品视频| 免费不卡亚洲欧美| 久热精品视频在线| 国产在线精品自拍| 午夜精品久久久久久久久久久久 | 欧美影院在线播放| 亚洲精品国产视频| 免费不卡视频| 欧美大片网址| 伊人激情综合| 久久婷婷久久| 国产精品国产三级国产专区53 | 亚洲午夜激情网页| 亚洲免费高清视频| 久久综合99re88久久爱| 久久精品三级| 国产一区二区三区在线观看网站| 亚洲视频免费在线观看| 亚洲欧美自拍偷拍| 国产精品久久久久久久浪潮网站| 亚洲免费激情| 亚洲在线1234| 亚洲综合色婷婷| 欧美日韩妖精视频| 在线天堂一区av电影| 亚洲美女黄网| 国产精品久久久久久久午夜| 亚洲视频成人| 老色鬼精品视频在线观看播放| 国产一区二区三区直播精品电影| 亚洲高清毛片| 亚洲一区二区精品视频| 欧美日韩免费观看一区| 亚洲一二三区在线| 久久九九免费视频| 18成人免费观看视频| 免费视频最近日韩| 欧美高清在线观看| 一本色道久久综合亚洲精品小说 | 欧美精品一区二区三区蜜桃 | 国产精品少妇自拍| 亚洲一区二区三区四区视频| 久久久亚洲欧洲日产国码αv | 一区二区三区黄色| 欧美一级在线视频| 亚洲成人在线观看视频| 欧美mv日韩mv国产网站| 99精品99久久久久久宅男| 午夜精品国产更新| 欧美日韩亚洲成人| 久久久久久久一区二区三区| 欧美激情一区二区三区成人| 欧美伊久线香蕉线新在线| 一区国产精品| 国产噜噜噜噜噜久久久久久久久| 麻豆成人综合网| 国产精品一区在线观看| 91久久黄色| 久久亚洲精选| 亚洲精品久久久久久久久久久久| 亚洲国产岛国毛片在线| 国产精品久久一区二区三区| 久久久久国产精品麻豆ai换脸| 在线亚洲免费视频| 久久一区二区三区国产精品| 激情久久久久久久久久久久久久久久| 亚洲区第一页| 欧美天堂亚洲电影院在线播放 | 亚洲黄色一区| 欧美主播一区二区三区| 亚洲精品日韩综合观看成人91| 久久国产免费| 国产在线观看一区| 亚洲成人资源| 欧美a级一区| 亚洲成色999久久网站| 噜噜噜在线观看免费视频日韩| 久久国产精品黑丝| 国产在线乱码一区二区三区| 久久午夜精品一区二区| 午夜精品久久99蜜桃的功能介绍| 国产亚洲激情视频在线| 亚洲视频在线观看网站| 午夜精品久久久久久99热软件| 性久久久久久| 久热这里只精品99re8久| 亚洲影音一区| 狠狠色综合日日| 久久亚洲午夜电影| 亚洲一品av免费观看| 久久久久国产精品一区三寸 | 久久综合九色欧美综合狠狠| 亚洲免费网站| 亚洲高清在线| 国产亚洲aⅴaaaaaa毛片| 国产精品久久久久国产a级| 欧美精品一区二区三区很污很色的| 久久久99爱| 欧美一区二区三区在线观看 | 亚洲精品久久7777| 最新中文字幕亚洲| 亚洲高清一二三区| 亚洲高清不卡av| 影音先锋久久| 国产精品欧美日韩一区二区| 欧美日本亚洲韩国国产| 亚洲欧美日韩综合aⅴ视频| 在线综合亚洲| 亚洲一级特黄| 午夜精品久久久99热福利| 亚洲在线播放| 亚洲欧美一区二区在线观看| 亚洲男人影院| 欧美在线视频a| 久久久久国产精品午夜一区| 久久久久久久一区二区三区| 久久综合色影院| 欧美1区3d| 欧美另类videos死尸| 欧美日一区二区三区在线观看国产免| 欧美日韩国产a| 国产精品女主播在线观看| 国产欧美日本| 国产精品草草| 欧美日韩和欧美的一区二区| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美日韩亚洲一区二| 亚洲精品在线观看视频| 亚洲理伦在线| 欧美美女操人视频| 一区二区三区视频在线看| 日韩视频在线你懂得| 欧美精品一区二区三区久久久竹菊 | 99精品国产福利在线观看免费| 国产精品久久99| 国产精品自在在线| 国产午夜亚洲精品不卡| 在线电影国产精品| 亚洲毛片在线| 亚洲欧美日韩视频二区| 久久久久久噜噜噜久久久精品| 老司机成人在线视频| 国产日韩欧美一区二区三区四区 | 久久综合色8888| 亚洲韩日在线| 99精品视频免费全部在线| 亚洲欧洲av一区二区|