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

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

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

    聶永的博客

    記錄工作/學習的點點滴滴。

    隨手記之Linux內核Backlog筆記

    零。前言

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

    以下內容基于Linux 2.6.18內核。

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

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

    man listen

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

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

    一般我們自己定義設定backlog值,若我們設置的backlog值大于net.core.somaxconn值,將被置為net.core.somaxconn值大小。若不想直接硬性指定,跟隨系統設定,則需要讀取/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;
    }
    

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

    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值就顯得很有必要。

    設置其值方法:

    sysctl -w net.core.somaxconn=65535
    

    較大內存的Linux,65535數值一般就可以了。

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

    二。網卡設備將請求放入隊列的長度,netdev_max_backlog

    內核代碼中sysctl.c文件解釋:

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

    我所理解的含義,每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的最大數目,一旦超過將被丟棄。

    所起作用處,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內核Backlog筆記 2014-07-30 18:01 旺達鎖業

    支持博主更新、、、、、、、、、、、  回復  更多評論   

    # re: 隨手記之Linux內核Backlog筆記 2014-07-30 22:06 月小升技術博客

    玩內核的高手,我現在只能用Linux,還不能玩內核。  回復  更多評論   

    # re: 隨手記之Linux內核Backlog筆記 2014-08-02 16:11 創業初期

    技術男.支持一下  回復  更多評論   

    # re: 隨手記之Linux內核Backlog筆記 2014-08-02 16:12 互聯網博客

    學習一下  回復  更多評論   

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

    記得以前在
    http://www.duanmeiwen.com/
    是有相關介紹的,不過現在變成了什么美文網了,可惜了!  回復  更多評論   

    公告

    所有文章皆為原創,若轉載請標明出處,謝謝~

    新浪微博,歡迎關注:

    導航

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

    統計

    常用鏈接

    留言簿(58)

    隨筆分類(130)

    隨筆檔案(151)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲福利电影一区二区?| 亚洲国产精品无码久久一线| 亚洲成a人片在线观看中文!!!| a毛看片免费观看视频| 亚洲最大AV网站在线观看| 国产免费高清69式视频在线观看| 国产日韩成人亚洲丁香婷婷| 中文字幕版免费电影网站| 国产亚洲美女精品久久久久狼| 国产在线国偷精品免费看| 亚洲国产美国国产综合一区二区| 特级精品毛片免费观看| 亚洲人成电影青青在线播放| 最近中文字幕无免费视频| 国产精品亚洲片在线花蝴蝶| 久久亚洲2019中文字幕| 久99久精品免费视频热77| 亚洲精品国产免费| 免费看a级黄色片| 一个人免费观看视频在线中文| 亚洲国产婷婷六月丁香| 免费观看无遮挡www的小视频| 亚洲午夜精品久久久久久app| 亚洲AV中文无码乱人伦在线视色 | 国产成人免费A在线视频| 美女黄网站人色视频免费| 亚洲人JIZZ日本人| 免费成人激情视频| 美女被爆羞羞网站在免费观看| 久久久久一级精品亚洲国产成人综合AV区| 人妻免费一区二区三区最新| 91亚洲国产成人久久精品| 国产成人3p视频免费观看| 特级做A爰片毛片免费看无码 | 亚洲欧美aⅴ在线资源| 国产精品亚洲二区在线观看 | 麻豆亚洲AV成人无码久久精品 | 毛色毛片免费观看| h视频在线免费观看| 亚洲乱码一二三四区国产| 亚洲福利在线播放|