<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    聶永的博客

    記錄工作/學(xué)習(xí)的點點滴滴。

    隨手記之Linux內(nèi)核Backlog筆記

    零。前言

    有些東西總是很容易遺忘,一時記得了,過兩天就真正還給周公了。零零碎碎的不如一并記下來,以后可以直接拿過來查詢即可。

    以下內(nèi)容基于Linux 2.6.18內(nèi)核。

    一。listen方法傳入的backlog參數(shù),net.core.somaxconn

    這個參數(shù)具體意義,先看看Linux Socket的listen解釋

    man listen

       #include <sys/socket.h>
    
       int listen(int sockfd, int backlog);
    

    int類型的backlog參數(shù),listen方法的backlog意義為,已經(jīng)完成三次握手、已經(jīng)成功建立連接的套接字將要進(jìn)入隊列的長度。

    一般我們自己定義設(shè)定backlog值,若我們設(shè)置的backlog值大于net.core.somaxconn值,將被置為net.core.somaxconn值大小。若不想直接硬性指定,跟隨系統(tǒng)設(shè)定,則需要讀取/proc/sys/net/core/somaxconn。

    net\Socket.c :

    /*
     *  Perform a listen. Basically, we allow the protocol to do anything
     *  necessary for a listen, and if that works, we mark the socket as
     *  ready for listening.
     */
    
    int sysctl_somaxconn = SOMAXCONN;
    
    asmlinkage long sys_listen(int fd, int backlog)
    {
        struct socket *sock;
        int err, fput_needed;
    
        if ((sock = sockfd_lookup_light(fd, &err, &fput_needed)) != NULL) {
            if ((unsigned) backlog > sysctl_somaxconn)
                backlog = sysctl_somaxconn;
    
            err = security_socket_listen(sock, backlog);
            if (!err)
                err = sock->ops->listen(sock, backlog);
    
            fput_light(sock->file, fput_needed);
        }
        return err;
    }
    

    比如經(jīng)常使用的netty(4.0)框架,在Linux下啟動時,會直接讀取/proc/sys/net/core/somaxconn值然后作為listen的backlog參數(shù)進(jìn)行調(diào)用Linux系統(tǒng)的listen進(jìn)行初始化等。

    int somaxconn = 3072;
    BufferedReader in = null;
    try {
        in = new BufferedReader(new FileReader("/proc/sys/net/core/somaxconn"));
        somaxconn = Integer.parseInt(in.readLine());
        logger.debug("/proc/sys/net/core/somaxconn: {}", somaxconn);
    } catch (Exception e) {
        // Failed to get SOMAXCONN
    } finally {
        if (in != null) {
            try {
                in.close();
            } catch (Exception e) {
                // Ignored.
            }
        }
    }
    
    SOMAXCONN = somaxconn;
    ......
    private volatile int backlog = NetUtil.SOMAXCONN;
    

    一般稍微增大net.core.somaxconn值就顯得很有必要。

    設(shè)置其值方法:

    sysctl -w net.core.somaxconn=65535
    

    較大內(nèi)存的Linux,65535數(shù)值一般就可以了。

    若讓其生效,sysctl -p 即可,然后重啟你的Server應(yīng)用即可。

    二。網(wǎng)卡設(shè)備將請求放入隊列的長度,netdev_max_backlog

    內(nèi)核代碼中sysctl.c文件解釋:

    number of unprocessed input packets before kernel starts dropping them, default 300
    

    我所理解的含義,每個網(wǎng)絡(luò)接口接收數(shù)據(jù)包的速率比內(nèi)核處理這些包的速率快時,允許送到隊列的最大數(shù)目,一旦超過將被丟棄。

    所起作用處,net/core/Dev.c:

    int netif_rx(struct sk_buff *skb)
    {
        struct softnet_data *queue;
        unsigned long flags;
    
        /* if netpoll wants it, pretend we never saw it */
        if (netpoll_rx(skb))
            return NET_RX_DROP;
    
        if (!skb->tstamp.off_sec)
            net_timestamp(skb);
    
        /*
         * The code is rearranged so that the path is the most
         * short when CPU is congested, but is still operating.
         */
        local_irq_save(flags);
        queue = &__get_cpu_var(softnet_data);
    
        __get_cpu_var(netdev_rx_stat).total++;
        if (queue->input_pkt_queue.qlen <= netdev_max_backlog) {
            if (queue->input_pkt_queue.qlen) {
    enqueue:
                dev_hold(skb->dev);
                __skb_queue_tail(&queue->input_pkt_queue, skb);
                local_irq_restore(flags);
                return NET_RX_SUCCESS;
            }
    
            netif_rx_schedule(&queue->backlog_dev);
            goto enqueue;
        }
    
        __get_cpu_var(netdev_rx_stat).dropped++;
        local_irq_restore(flags);
    
        kfree_skb(skb);
        return NET_RX_DROP;
    }
    

    以上代碼看一下,大概會明白netdev_max_backlog會在什么時候起作用。

    posted on 2014-07-30 17:22 nieyong 閱讀(15490) 評論(5)  編輯  收藏 所屬分類: Socket

    評論

    # re: 隨手記之Linux內(nèi)核Backlog筆記 2014-07-30 18:01 旺達(dá)鎖業(yè)

    支持博主更新、、、、、、、、、、、  回復(fù)  更多評論   

    # re: 隨手記之Linux內(nèi)核Backlog筆記 2014-07-30 22:06 月小升技術(shù)博客

    玩內(nèi)核的高手,我現(xiàn)在只能用Linux,還不能玩內(nèi)核。  回復(fù)  更多評論   

    # re: 隨手記之Linux內(nèi)核Backlog筆記 2014-08-02 16:11 創(chuàng)業(yè)初期

    技術(shù)男.支持一下  回復(fù)  更多評論   

    # re: 隨手記之Linux內(nèi)核Backlog筆記 2014-08-02 16:12 互聯(lián)網(wǎng)博客

    學(xué)習(xí)一下  回復(fù)  更多評論   

    # re: 隨手記之Linux內(nèi)核Backlog筆記 2014-08-08 11:48 喜歡研究的人類

    記得以前在
    http://www.duanmeiwen.com/
    是有相關(guān)介紹的,不過現(xiàn)在變成了什么美文網(wǎng)了,可惜了!  回復(fù)  更多評論   

    公告

    所有文章皆為原創(chuàng),若轉(zhuǎn)載請標(biāo)明出處,謝謝~

    新浪微博,歡迎關(guān)注:

    導(dǎo)航

    <2014年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統(tǒng)計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久亚洲精品国产精品黑人| 亚洲国产中文字幕在线观看| 亚洲视频日韩视频| 久久亚洲国产成人影院网站| 精品亚洲国产成人av| 在线播放免费人成视频在线观看| 浮力影院亚洲国产第一页| 免费无毒a网站在线观看| 亚洲 自拍 另类小说综合图区| 亚洲国产精品成人午夜在线观看 | 亚洲欧洲免费无码| 免费一级毛片在线播放视频| 国产成人无码综合亚洲日韩| 久久久久久AV无码免费网站 | 国产精品视_精品国产免费| 亚洲成av人在线观看网站| 免费人成在线观看网站视频| 特a级免费高清黄色片| 亚洲一区精品无码| 1000部夫妻午夜免费| 亚洲AV无码精品蜜桃| 9277手机在线视频观看免费| 国产国拍精品亚洲AV片| 免费观看在线禁片| 亚洲国产一区在线观看| 国产一区视频在线免费观看| 亚洲色少妇熟女11p| www.亚洲一区| 久久免费国产视频| 在线综合亚洲欧洲综合网站| www国产亚洲精品久久久日本| 今天免费中文字幕视频| 亚洲国产成人精品激情| 国产精品久久久久免费a∨| 亚洲av日韩综合一区久热| 亚洲色偷拍另类无码专区| 57PAO成人国产永久免费视频 | 亚洲成av人无码亚洲成av人| 亚洲色偷偷偷鲁综合| 男男AV纯肉无码免费播放无码| 水蜜桃视频在线观看免费|