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

那誰(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>
            久久久久久免费| 亚洲午夜精品久久久久久浪潮| 久久精品中文| 激情国产一区二区| 美女久久一区| 欧美区在线观看| 亚洲淫性视频| 欧美中文字幕| 亚洲国产欧美日韩精品| 亚洲经典一区| 欧美视频在线观看一区二区| 久久成人免费网| 蜜臀久久久99精品久久久久久 | 女女同性精品视频| 亚洲午夜av在线| 欧美一区二区网站| 亚洲免费福利视频| 亚洲欧美日韩精品久久亚洲区 | 欧美日韩视频一区二区三区| 欧美一级欧美一级在线播放| 久久久亚洲午夜电影| 一区二区免费在线视频| 欧美一区二区免费| 日韩亚洲视频在线| 欧美一区二区三区免费视频| 亚洲毛片一区| 久久狠狠久久综合桃花| 亚洲免费激情| 一本一本久久a久久精品牛牛影视| 欧美亚洲一区二区三区| 六十路精品视频| 亚洲一级在线| 久久精品国产精品亚洲| 亚洲天堂网站在线观看视频| 久久久久国内| 欧美一区二区高清在线观看| 欧美国产专区| 久热精品视频| 国产欧美日韩亚洲一区二区三区| 亚洲人体偷拍| …久久精品99久久香蕉国产| 亚洲综合日韩| 夜夜嗨av一区二区三区四季av | 亚洲国产精品一区二区第四页av| 国产精品中文在线| 99精品欧美一区二区蜜桃免费| 国产一区在线看| 午夜精品福利一区二区蜜股av| 日韩亚洲一区在线播放| 欧美 日韩 国产 一区| 久久久久成人精品| 国产午夜精品久久久久久久| 一区二区三区日韩欧美| 亚洲少妇自拍| 欧美日韩精品系列| 亚洲精品男同| 日韩一本二本av| 欧美日本亚洲韩国国产| 亚洲第一中文字幕| 亚洲国产视频a| 蜜臀91精品一区二区三区| 欧美成人69| 亚洲电影在线播放| 美国十次成人| 亚洲第一色中文字幕| 亚洲国内精品| 欧美成人免费视频| 最近中文字幕mv在线一区二区三区四区| 黑人巨大精品欧美一区二区| 久久精品99国产精品日本| 久久精品国产清自在天天线| 国产一区日韩二区欧美三区| 久久久久久香蕉网| 欧美成人在线免费观看| 亚洲片区在线| 欧美日韩视频| 亚洲一区三区电影在线观看| 久久成人精品一区二区三区| 国产一区二区成人| 久久婷婷影院| 亚洲国产精品一区制服丝袜 | 国产精品腿扒开做爽爽爽挤奶网站 | 国产女精品视频网站免费| 久久国产成人| 亚洲国产va精品久久久不卡综合| 日韩视频欧美视频| 国产精品网站一区| 久久久久久伊人| 亚洲伦理在线| 久久成人18免费观看| 亚洲激情精品| 国产精品系列在线播放| 久久久精品999| 亚洲精品久久久一区二区三区| 一区二区三区视频在线看| 黄色亚洲免费| 欧美精品九九99久久| 中文在线一区| 你懂的亚洲视频| 亚洲午夜精品一区二区三区他趣| 国产毛片精品国产一区二区三区| 久久人人97超碰国产公开结果| 日韩亚洲一区二区| 久久天堂精品| 亚洲已满18点击进入久久| 一区二区三区在线观看欧美| 欧美日韩视频第一区| 久久一区中文字幕| 亚洲一区国产视频| 亚洲国产欧美另类丝袜| 久久久爽爽爽美女图片| 亚洲午夜高清视频| 亚洲高清自拍| 国产午夜精品理论片a级大结局| 欧美劲爆第一页| 久久午夜视频| 性色av一区二区怡红| 夜夜嗨av一区二区三区四季av| 免费成人高清视频| 久久xxxx| 午夜在线观看欧美| 亚洲免费在线观看| 亚洲视频axxx| 一二三区精品| 亚洲精品偷拍| 亚洲经典三级| 亚洲国产精品高清久久久| 国产人成精品一区二区三| 欧美午夜不卡在线观看免费 | 国内成人精品2018免费看| 国产精品久久久久av免费| 欧美金8天国| 欧美国产三级| 欧美成人国产va精品日本一级| 久久激情视频久久| 久久精精品视频| 欧美在线观看视频在线| 午夜一区不卡| 香港久久久电影| 香蕉乱码成人久久天堂爱免费| 亚洲在线黄色| 午夜精品久久久久久久久久久久久| 在线一区日本视频| 亚洲一区制服诱惑| 亚洲欧美日韩区| 久久99伊人| 麻豆精品一区二区综合av| 老司机成人网| 欧美激情一区三区| 欧美日韩精品一区视频| 国产精品v欧美精品v日韩| 国产精品久久久久免费a∨大胸| 国产精品高精视频免费| 国产精品视频网站| 国产视频在线观看一区二区三区 | 乱码第一页成人| 欧美国产日韩xxxxx| 欧美日韩国产一区二区三区地区| 欧美日韩一二三四五区| 国产精品日韩欧美综合| 国产视频在线一区二区| 在线免费精品视频| 一区二区av| 久久精品九九| 亚洲大片在线| 亚洲桃花岛网站| 久久精品中文字幕免费mv| 亚洲精品激情| 午夜激情久久久| 麻豆成人91精品二区三区| 欧美日韩三级一区二区| 国产日韩欧美在线播放不卡| 在线欧美小视频| 一区二区福利| 久久久在线视频| 亚洲精品色图| 久久久久久日产精品| 欧美日韩精品| 伊人久久大香线蕉综合热线| 亚洲天堂黄色| 欧美 日韩 国产在线| 亚洲一品av免费观看| 免费试看一区| 国产日韩欧美综合| 一区二区国产精品| 欧美α欧美αv大片| 在线中文字幕一区| 欧美顶级少妇做爰| 国产综合色在线视频区| 中文精品视频一区二区在线观看| 久久人人爽爽爽人久久久| 夜夜嗨av一区二区三区四区| 老鸭窝亚洲一区二区三区| 国产精品一区二区在线| 99热免费精品| 亚洲国产精品久久久久秋霞蜜臀 | 亚洲日韩欧美视频一区| 久久久久天天天天| 国产伦精品一区二区三区视频黑人 | 欧美日韩伦理在线免费|