hiyachen 发表于 2014-01-04 20:14

wang290 发表于 2013-05-20 16:38 static/image/common/back.gif
摘要:C10K问题让我们意识到:当并发连接达到10K时,选择不同的解决方案,笔记本性能可能会超过16核服务器。 ...
一种思路,虽然需要尝试,但值得一读。

hiyachen 发表于 2014-01-04 20:17

mordorwww 发表于 2013-12-16 11:21 static/image/common/back.gif
木有看懂
千万级并发的瓶颈在哪里?
CPU?Memory? IO?
应用程序管理内存和CPU

mordorwww 发表于 2014-01-06 09:04

本帖最后由 mordorwww 于 2014-01-06 09:14 编辑

hiyachen 发表于 2014-01-04 20:17 static/image/common/back.gif
应用程序管理内存和CPU


CPU对liuux内核还有区别?
还有内存管理,有那么复杂么,用数组就是了,对服务器来讲,这点内存真不算啥

wang290 发表于 2014-02-09 10:37

hiyachen 发表于 2014-01-04 20:17 static/image/common/back.gif
应用程序管理内存和CPU

确实是,高并发下的问题,很多都颠覆了我们以往考虑问题的角度

mordorwww 发表于 2014-02-10 11:32

wang290 发表于 2014-02-09 10:37 static/image/common/back.gif
确实是,高并发下的问题,很多都颠覆了我们以往考虑问题的角度

很抽象

gaojl0728 发表于 2014-02-10 15:35

观点真的很新颖,如果能有具体实现案例就好了,

chengtao786 发表于 2014-02-11 11:20

不明觉厉,学习了,多谢!

chengtao786 发表于 2014-02-11 11:24

    如果每秒处理的连接从5千增加到1万,你会怎么做?比方说,你升级硬件并且提高处理器速度到原来的2倍。发生了什么?你得到两倍的性能,但你没有得到两倍的处理规模。每秒处理的连接可能只达到了6000。你继续提高速度,情况也没有改善。甚至16倍的性能时,仍然不能处理1万个并发连接。所以说性能和可扩展性是不一样的。

    问题在于Apache会创建一个CGI进程,然后关闭,这个步骤并没有扩展。

    为什么呢?内核使用的O(N^2)算法使服务器无法处理1万个并发连接。

    内核中的两个基本问题:

    连接数=线程数/进程数。当一个数据包进来,内核会遍历其所有进程以决定由哪个进程来处理这个数据包。

    连接数=选择数/轮询次数(单线程)。同样的可扩展性问题,每个包都要走一遭列表上所有的socket。

    解决方法:改进内核使其在常数时间内查找。

    使线程切换时间与线程数量无关。
    使用一个新的可扩展epoll()/IOCompletionPort常数时间去做socket查询。

    因为线程调度并没有得到扩展,所以服务器大规模对socket使用epoll方法,这样就导致需要使用异步编程模式,而这些编程模式正是Nginx和Node类型服务器具有的;所以当从Apache迁移到Nginx和Node类型服务器时,即使在一个配置较低的服务器上增加连接数,性能也不会突降;所以在10K连接时,一台笔记本电脑的速度甚至超过了16核的服务器。
点睛之笔,佩服。

chengtao786 发表于 2014-02-11 11:48

怎样编写规模较大的软件?

如何改变你的软件,使其规模化?许多只提升硬件性能去支撑项目扩展的经验都是错误的,我们需要知道性能的实际情况。

要达到到更高的水平,需要解决的问题如下:

    数据包的可扩展性
    多核的可扩展性
    内存的可扩展性

漂亮,以前一直有个疑问”为什么苹果的iPhone 4硬件配置差,但性能却比ZTE v880性能好太多太多“,通过你的帖子,我想已大概有了答案了,再次感谢。

bag_bai 发表于 2014-05-04 23:12

神啊。。。这个帖子必须留存备查~
页: 1 [2] 3
查看完整版本: 千万级并发实现的秘密:内核不是解决方案,而是问题所在!