<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 閱讀(15501) 評論(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)

    個人收藏

    最新隨筆

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 九九免费久久这里有精品23| jzzijzzij在线观看亚洲熟妇| 91嫩草亚洲精品| 亚洲午夜无码毛片av久久京东热| 亚洲成av人在线观看网站| 有色视频在线观看免费高清在线直播| 中文字幕永久免费| 182tv免费观看在线视频| 成在人线AV无码免费| 亚洲国产成人久久一区WWW| 亚洲国产成人一区二区三区| 亚洲综合图片小说区热久久| 亚洲狠狠婷婷综合久久| 成年午夜视频免费观看视频| 69成人免费视频无码专区| 成人一区二区免费视频| 羞羞视频在线观看免费| 野花香高清在线观看视频播放免费 | 日韩伦理片电影在线免费观看| 日韩精品电影一区亚洲| 亚洲尹人九九大色香蕉网站| 亚洲综合av一区二区三区不卡| 一级视频免费观看| 最近在线2018视频免费观看| 日韩中文无码有码免费视频| 亚洲av永久无码精品网站 | 久久亚洲精品无码av| 免费无码又爽又刺激一高潮| 永久免费的网站在线观看| 亚洲日韩中文字幕日韩在线| 亚洲春色另类小说| 一级成人a做片免费| 国产大片免费网站不卡美女| 亚洲区小说区图片区| 亚洲国产电影在线观看| 国产成人自产拍免费视频| 全免费毛片在线播放| 亚洲中文久久精品无码| 亚洲国产av玩弄放荡人妇| 免费人成视频在线观看网站| www.亚洲精品.com|