免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2871 | 回复: 13

[网络子系统] 网络问题,发到内核板看看 [复制链接]

论坛徽章:
0
发表于 2013-01-30 16:19 |显示全部楼层
# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
....
tcp        0 13481742 192.168.88.191:555      218.xxx.xxx.79:59018     ESTABLISHED
.......

从上面看出缓存的数据约13M, 我该如何做让这个值在2M左右之后不再增大?
即让send 发送失败.

我调用下面函数设置成功了,但是仍然会出现上述情况
int sock_sendbuffsize(int fd, int buffsize)
{
    int bs = buffsize;
    socklen_t sz = sizeof(bs);
    if(-1 == setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&bs, sizeof(int)))
    {
        perr("setsockopt");
        return -1;
    }
    return 1;
}

我该如何做,请高手指点下,谢谢

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-01-30 19:12 |显示全部楼层
回复 1# pppStar
# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
....
tcp        0 13481742 192.168.88.191:555      218.xxx.xxx.79:59018     ESTABLISHED
.......

从上面看出缓存的数据约13M, 我该如何做让这个值在2M左右之后不再增大?
即让send 发送失败.

我调用下面函数设置成功了,但是仍然会出现上述情况
int sock_sendbuffsize(int fd, int buffsize)
{
    int bs = buffsize;
    socklen_t sz = sizeof(bs);
    if(-1 == setsockopt(fd, SOL_SOCKET, SO_SNDBUF, (char*)&bs, sizeof(int)))
    {
        perr("setsockopt";
        return -1;
    }
    return 1;
}


来内核版问就对了

你需要明白一个事实:
         setsockopt的SO_SNDBUF与netstat显示的Send-Q含义,前者表示可用于发送的队列的长度,后者表示的是内核已经发送但是还没有得到对端ack的数据包的总长度,这两者没有直接的关系。
         比如SO_SNDBUF是100,向对端发送数据包,对端内核会对ack应答,这个时候数据包在对端的Recv-Q中,不再本地的SNDBUF中也不再Send-Q中,如果对端的接收队列满了,那么可能会慢慢的累积本段的Send-Q,但是SO_SNDBUF仍然没有满。

   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
发表于 2013-01-30 20:34 |显示全部楼层
本帖最后由 Godbach 于 2013-01-30 20:36 编辑

回复 1# pppStar
晕,LZ 的头像和 send_linux 一样,我都认错了


   

论坛徽章:
4
酉鸡
日期:2014-03-21 23:19:50狮子座
日期:2014-08-01 22:11:40酉鸡
日期:2015-01-10 21:31:442015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-01-30 20:59 |显示全部楼层
嗯...是对端接收太慢的问题

论坛徽章:
0
发表于 2013-01-31 09:06 |显示全部楼层
回复 2# 瀚海书香


    我认为SO_SNDBUF的大小应该是Send-Q最大值,问题是设置了没有起效果

   某次测试的情况
   setsockopt(3, SOL_SOCKET, SO_RCVBUF, [1000000], 4) = 0
   getsockopt(3, SOL_SOCKET, SO_RCVBUF, [225280], [4]) = 0
  write(1, "modified receive buffer size = 2"..., 38modified receive buffer size = 225280
   ) = 38
  setsockopt(3, SOL_SOCKET, SO_SNDBUF, [1000000], 4) = 0
  getsockopt(3, SOL_SOCKET, SO_SNDBUF, [225280], [4]) = 0
  write(1, "modified snd buffer size = 22528"..., 34modified snd buffer size = 225280
  ) = 34

  谢谢版主,谢谢各位

我头像抄的, 我看版主的头像还像是linuxsir里面的人呢,

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-01-31 09:11 |显示全部楼层
回复 5# pppStar
我认为SO_SNDBUF的大小应该是Send-Q最大值,问题是设置了没有起效果

已经跟你说了,这两个参数没有直接的关系啊。假如你给pc换个内存条,cpu的频率会变吗?
   

论坛徽章:
0
发表于 2013-01-31 09:34 |显示全部楼层
嗯,谢谢

核心问题还没解决,
请教下如何防止在对方接收慢的时候让Send-Q不至于过大以至于耗尽内存的情况出现呢?
当然也要同时满足对方接收快的时候(如局域网)有足够的性能

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
发表于 2013-01-31 10:12 |显示全部楼层
本帖最后由 daniel_11 于 2013-01-31 10:17 编辑

晕,还没遇到这种问题。。。
不过根据描述:
Send-Q
The count of bytes not acknowledged by the remote host.
是否可以调整tcp timeout 时间?我的意思要从tcp协议入手?

话说我头像太挫了。。。

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
发表于 2013-01-31 10:58 |显示全部楼层
回复 8# daniel_11
其实这种问题在tcp层来解决,个人认为不妥。本身这个问题是应用层之间协商的问题,非要让底层解决,肯定会费力的。

在应用层实现一个应用层的简单协商就可以完美解决了啊。

   

论坛徽章:
10
戌狗
日期:2013-10-17 09:43:0215-16赛季CBA联赛之广东
日期:2018-02-05 11:22:1215-16赛季CBA联赛之八一
日期:2016-07-04 12:26:1815-16赛季CBA联赛之青岛
日期:2016-06-08 11:15:4115-16赛季CBA联赛之辽宁
日期:2016-04-05 10:10:1415-16赛季CBA联赛之辽宁
日期:2016-03-11 11:11:48酉鸡
日期:2014-12-18 14:35:48狮子座
日期:2014-02-20 10:14:07寅虎
日期:2013-12-02 13:48:2915-16赛季CBA联赛之广夏
日期:2018-03-21 08:51:10
发表于 2013-01-31 11:09 |显示全部楼层
回复 9# 瀚海书香
嗯,确实如此。
BTW, tcp有keepalive的option,没用过不知如何?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP