|
c****3 发帖数: 10787 | 2 要设SO_SNDBUF和SO_RCVBUF,否则光这两个socket buffer在Linux里的默认值,就吃掉
大量内存 |
|
S*A 发帖数: 7142 | 3 还没有开始发数据,好像我没有改也过了。
没准有真正数据才开始用 buffer?
你们会碰到其他险恶的问题的,哈哈哈。 |
|
c****3 发帖数: 10787 | 4 不用发数据,这两个buffer是在TCP连接建立好之前设置的,建立之后就不能改了。对
应就TCP协议里的用于流控的TCP Windows size。
如果默认值是2K,发送接收4K,1M连接,光这两个buffer,就需要4G内存 |
|
S*A 发帖数: 7142 | 5 我可以告诉你的是我的实验通过了,就是在4G 的笔记本上,
服务器端程序没有改。(其配置有改)。这个buffer 我的确
没有碰。你能指出 kernel allocate buffer 的代码在那里吗?
我们可以一起看看是不是空连接就已经分配 window buffer 了。
我粗略看了一下,没有在连接的时候找到。如果你很确定知道
buffer 在那里分配的,有 kernel 源程序最好。那值得研究一下
为什么我的机器没有 crash. |
|
|
S*A 发帖数: 7142 | 7 这个问题我大概有理解了。那个tcp buffer 就是sk_buff 链。没有其它的另外buffer
,所以没有数据就是空的。 |
|
b*******s 发帖数: 5216 | 8 昨天看了下内核的代码,新建socket就是分配了新的inode,以及你说的sk list,一个空
的双向链表,还有些structure
buffer |
|
S*A 发帖数: 7142 | 9 //hand
这个也是我的结论。那个 TCP buffer 就是在sk_buffer 链里面表示的。 |
|
|
b*******s 发帖数: 5216 | 11 昨天还干了件蠢事,直接给vm分了4g内存,想看看有什么区别
后来发现vm里centos是32位的 |
|
S*A 发帖数: 7142 | 12 2G/2G or 3G/1G split kernel 地址空间不够用? |
|
S*A 发帖数: 7142 | 13 提示一下,这个练习需要编写连接一个远程端口的时候,
使用指定的本定 IP 地址。如果让系统自动挑 IP, 系统
只会自动挑第一个满足 routing 条件的 IP,用光这个 IP
所有的端口就跑不下去了。
谁来试着改进一下程序使用指定的本地 IP? |
|
d*******r 发帖数: 3299 | 14 搞个 github 帐号吧,把大家的研究成果和步骤存上去 |
|
S*A 发帖数: 7142 | 15 我其实就是抛砖引玉而已,我大概不会把解决方案
直接贴上去,这样就没有了解决问题的乐趣。我说的
这些问题,分开拆解其实都不难对付。
github 大概会要有更加成熟的东西才会考虑贴。 |
|
l***e 发帖数: 450 | 16 not exactly,the so_snd and so_rcv only enforce the limit of buffer that can
be used/queued at the socket, it does not really commit any buffer space.
The buffer comes from network driver for inbound traffic, and application
for outbound traffic. |
|
c****3 发帖数: 10787 | 17 IP fragment重组是不能靠network driver的,没有buffer怎么做。
can |
|
S*A 发帖数: 7142 | 18 这个问题我和 brainless 在另外一个贴里面有比较深入的讨论了。
http://www.mitbbs.com/article_t1/Programming/31330685_0_7.html
这个在建立空的 TCP 连接的时候是不需要的。也就是说,现在
的 Linux 还是比较聪明的,不会在没有需要的时候把buffer 白白
预留在那里。
buffer 就是以 sk_buff 的形式存在的,是有数据进来的时候才
分配。IP fragment 就是用buffer的其中一部分,对网卡就是改
buffer地址和长度,没有什么难度。要把几个用户的send buffer
合并到一个 ip 包里面,依然可以用网卡驱动直接完成。现在网卡
有 scatter/gather list, 你可以把几个不同的buffer直接告诉网卡
用一个包发出去。只有特别老的网卡不支持 scatter/gather list.
我记得以前特别著名的 NE2000 就是那样,现在应该没有那种网卡
了。 |
|
b*******s 发帖数: 5216 | 19 最近我在考虑买台server做试验用,看看现在8个核,64g ram的机器也就两三千刀
和一个macbook pro开发本差不多贵 |
|
S*A 发帖数: 7142 | 20 回到正题上,用 4G 内存的笔记本保持 1M 个空的 TCP 连接
我已经实验出来了。所以这一步定下的目标是可以是实现的,
大家不用过于担心 4G 不够用的问题,至少这一步不用。
还是需要在客户端改用指定的 IP 地址才能避免同一个 IP 有
65K 个端口的限制。现在我还没有看到有其他同学贴这个代码
出来。这样吧,我再放 10 个包子,给第一个贴用多个 IP 连
接的。就是简单的 socket 编程啊。
然后我再追加一个非常简单的要求,原来程序里面得到的连接
的 handle 是直接扔掉的。现在要求把得到的 handle 放到一个
大数组里面,1M TCP 就是 4M 空间,很小。然后这把柄的数
组就是下一步练习 3 epoll 要用到的。
大家加油啊。 |
|
j*a 发帖数: 14423 | 21 我觉得这个说得挺清楚的了:
http://stackoverflow.com/questions/1175108/
Use getifaddrs() to enumerate all the interfaces
and find the IP address for the interface you want
to bind to. Then use bind() to bind to that IP
address, before you call connect(). |
|
|
S*A 发帖数: 7142 | 23 这个说的对,我的实验也是这样干的。
只不过 interface 是我自己建立的,我不用去查看
什么 IP。查看也行,如果已经有程序建立了那 20
多个虚拟网卡。我不建议手动建立 20 个 ip alias.
等待代码。 |
|
S*A 发帖数: 7142 | 24 不要被我呼悠了啊,我可不保证你的 server 可以上 10M 连接啊.
如果你真的要买,搞个 Intel 的网卡,可以玩 DKDP。 看上去
DKDP 比 OpenOnLoad 可玩性高。实用不一定啊。
建议还是先用的现有的机器把实验做了,把低端机器推到极致。
确定是内存限制了你的性能,然后再上高端的机器。 |
|
b*******s 发帖数: 5216 | 25 不光是做这个试验,反正也没几个钱,还能捣鼓点别的东西 |
|
S*A 发帖数: 7142 | 26 老实说我有点失望,没有一个同学能够贴个实现
24 楼说的用多个 IP 地址建立外部连接的C 代码。
我觉得大概也没有什么人能 follow 这个实验了。
我就直接说了后面会碰到什么问题了吧。在很多
distro 里面缺省是有 firewall 的,很容易就碰到
connection state tracking 的限制。这个解决办法
大家自己放狗吧。
在 FC 20 上,解决了这两个问题,就可以在 4G
内存的机器上保持 1M 的空 TCP 连接了。内存
更多应该连接数目更多,是线性的关系。
至于传输速率可到多少,看实验三。 |
|
w***g 发帖数: 5958 | 27 我一直在用一台3770K(6核)+64G内存的台式机做开发,速度比我能接触到的公司和学校
实验室的双CPU服务器都要快,也就一千来块钱。一般都是我在自己机器上调好了以后
放过去一跑咦没这么慢的呀。不知道现在有没有128G的台式机主板。 |
|
j********x 发帖数: 2330 | 28 ip defragmentation 就是协议栈一部分吧,不给driver做谁来做? |
|
h**********c 发帖数: 4120 | 29 any one who does not support this post will lose the track of his or her
career.
We program, we proud, we vely rule! |
|
S*A 发帖数: 7142 | 30 netmap? raw socket 不可能太快,每个 packet 至少一个系统调用,
次数太多。
benchmark |
|
q*c 发帖数: 9453 | 31 主要是没动力。你要哪怕悬赏 10k 刀,几天甚至几个小时代码就出来了。
否则没多少人有闲暇干这个没啥意义的事情。 |
|
s*****t 发帖数: 89 | 32 我以前写网卡驱动的时候是需要分配内存的,没有数据源(不管是物理设备还是虚拟设
备)什么协议栈都是空的。
可以看看这个资料 |
|
T********i 发帖数: 2416 | 33 我最常去是一个私聊论坛。网友都是一群自称老帮菜的人物。
这群80年代出国的才是精英。很多都是文革时期憋了10-20年后脱颖而出的那一批。
大家天南海北的聊。但是说不过就亮资历是让人瞧不起的。“亮牌子你就输了”就是我
在那里学会的。
如果你在本领域牛,你摆事实讲道理就好了。动不动自己title如何?做过什么不相干
的项目?收入多少?有关系么?
对我个人来说,仅仅从做技术而言,做别人都能做的没意思;做别人不能做的才有意思
。一个人管理一个大系统的研发;不如一个人完成一个大系统的研发有意思。看看到底
能做多大,也是对自己的一个挑战。
技术讨论,如果说话没有common sense,这个人的资格就有问题。什么别人是做客户端
自己是做服务器的之类的?我的系统从芝加哥到纽约几十台server协作,技术上还是商
务逻辑上你能定义这个是client还是server?什么人家的架构动不动就崩?我的系统连
续运行10来年了,要是崩了我就出名了。
技术就是技术,唯一的区别是你能不能做的问题。而不是用到什么领域的问题。我不光
对C10M有兴趣,还对HTTP Live Streaming之类的有兴趣,还有很多其... 阅读全帖 |
|
|
S*A 发帖数: 7142 | 35 Coroutine 是写 C based 的 serverlet 几乎必然用到的。
这个我也在玩。看看老Wei 如何说吧。 |
|
T********i 发帖数: 2416 | 36 没这么复杂。cotoutine还要保存separate stack。
呵呵,让我想起Apple Lisa和Windows 3.0的时代。 |
|
T********i 发帖数: 2416 | 37 基本原理都是一样的。我说过EE玩SOC的更能理解。
其实,我用C++写几个小class,没啥必要做的这么generic。 |
|
b*******s 发帖数: 5216 | 38 第二个是不是和kernel有关
threading |
|
T********i 发帖数: 2416 | 39 不知道你说的是什么第二个?但是我可以肯定和kernel无关。
kernel要尽量bypass。 |
|
|
|
T********i 发帖数: 2416 | 42 isolcpus=X,X,X,X,X,...
这个是必须的。
其实,此人帖子里提到的所有优化,我都做了。他没有提的,我也做了。当然,他没有
提的,并不代表他没做。我认为他也做了,只不过不愿意说罢了。
这种东西,就像接头暗号。问一个问题,如果双方都懂,那么彼此的默契马上就达成了。 |
|
d*******r 发帖数: 3299 | 43 C10M 大概要用多少个什么级别的 instances?
我总感觉在 LB 后面,有些东西会被限制的,比如单机的连接数目 |
|
d*******r 发帖数: 3299 | 44 你说的对,大多数情况是 1500, 所以没啥问题,但是我感觉还是不是 100% 保险
The MSS that is chosen is the smaller of the values provided by the two ends
. If one endpoint does not provide its MSS, then 536 bytes is assumed, which
is bad for performance.
http://publib.boulder.ibm.com/infocenter/aix/v7r1/index.jsp?top
对了,你 SSA 的 C10M 系列进行到哪里了? :) |
|
g*****g 发帖数: 34805 | 45 我老10多年前开始混这个版的时候,internet bubble刚破,CS不算吃香,F2大妈们纷
纷转向统计和护士,这个版上讨论问题的大多是科班出身的。语言之类的争吵虽然有,
但很少有外行出来指点江山,一看就错得离谱的。自从上次经济危机之后,码农的收入
节节上升,酸葡萄多了,各路牛鬼蛇神开始出来鄙视职业码农的事情也开始层出不穷。
诸如12306不行,就有学EE没写过商业网站的出来打包票,明明是Scalability问题非要
追求微秒级latency,把高并发生生写成计数器。有觉得WhatsApp容易,C10K没实践过
,要挑战C10M的。有千老只写过自己用的一次性C++程序,就推荐以C&P替代代码复用的
。有改现成的商业PHP网站都吐血精分,非要强调码农的能力表现在底层,以对流水线
调度的认识深度区分。最新的又有智商论,编程纯工具论,反正ID边上也没标着智商,
大意就是我智商比你高,学个CS小菜呀,做码农轻松比你科班的强。
我老想起来魏老师千辛万苦写个计数器,用了高大上的compare&exchange之类的技术来
达到non-blocking的目的。我老质疑联票没有integrity... 阅读全帖 |
|
T********i 发帖数: 2416 | 46 核心机就是实现实时抢票的业务逻辑,没必要搞100万连接。就算真有100万连接,1-2
个CPU core足够处理了。现在大家谈论的都是C10M ,单机1000万连接了。反正有
kernel bypass的硬件NIC。
我最初就给定了假设,全国一盘棋,强耦合的铁路网络,实时出票,优化座位。在此条
件下,单机核心效率最高。根本不应该那么多疑议。
给定什么条件,就要在此条件下找最好的方案。如此而已。 |
|
g*****g 发帖数: 34805 | 47 我老人家没吹牛逼过宇宙第一。有比我们规模大的又如何?我老人家只是教育过你,实
践中最少做过C10K,才有资格来谈 C10M怎么实现。否则跟没做过飞机上来就要设计载
人登
月飞船一个性质。不是单机上摆弄俩计数器就叫实现了。12306已经做成了太监计数器
,眼见着 WhatsApp也要走同一路子。 |
|
g*****g 发帖数: 34805 | 48 LOL,你跟太监一个德性,能力不行,被打脸就嘴硬。你要吗去找个FG实现了的来现身
说法,要吗就别扯这种莫须有的蛋了。这就跟我说我比陈景润还牛逼,我能证明1+1,
你要我拿证明,我说我不告诉你,但你不信来举个反例,屁技术讨论。一个系统是实现
出来的,不是算内存算出来的。否则多加点内存就无限scale了。外行装逼还装出个性
了。
还是那句话,把系统拿出来实测,让你FG的朋友来帮你我没拦着你,做不出来光打嘴炮
你就跟太监一样自称宇宙第一又如何?需要证明自己的是你和你的傻逼系统,我有资格
没资格的又如何?我又没脑残到要单机C10M。你要战胜风车,我还要技术分析你为啥不
行,你太有才了。 |
|
T********i 发帖数: 2416 | 49 你会做个屁?叫嚣了C*鲁棒性这么多年,连flush和sync都搞不清楚。你也就能牵狗答
疑换取几句吹捧自慰罢了。
你这个无耻真是极品。让我碰到绝对是杀了喂狗的命。
C10M |
|
T********i 发帖数: 2416 | 50 古德霸可以自己定义C10M。这算个啥?丫说的比这更无耻的多了去了。
连flush和sync都搞不清。就敢聒噪鲁棒性这么多年。他还有啥不敢说的? |
|