Linux性能优化实战
倪朋飞
微软资深工程师,Kubernetes项目维护者
立即订阅
23318 人已学习
课程目录
已完结 64 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (2讲)
开篇词 | 别再让Linux性能问题成为你的绊脚石
免费
01 | 如何学习Linux性能优化?
CPU 性能篇 (13讲)
02 | 基础篇:到底应该怎么理解“平均负载”?
03 | 基础篇:经常说的 CPU 上下文切换是什么意思?(上)
04 | 基础篇:经常说的 CPU 上下文切换是什么意思?(下)
05 | 基础篇:某个应用的CPU使用率居然达到100%,我该怎么办?
06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?
07 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(上)
08 | 案例篇:系统中出现大量不可中断进程和僵尸进程怎么办?(下)
09 | 基础篇:怎么理解Linux软中断?
10 | 案例篇:系统的软中断CPU使用率升高,我该怎么办?
11 | 套路篇:如何迅速分析出系统CPU的瓶颈在哪里?
12 | 套路篇:CPU 性能优化的几个思路
13 | 答疑(一):无法模拟出 RES 中断的问题,怎么办?
14 | 答疑(二):如何用perf工具分析Java程序?
内存性能篇 (8讲)
15 | 基础篇:Linux内存是怎么工作的?
16 | 基础篇:怎么理解内存中的Buffer和Cache?
17 | 案例篇:如何利用系统缓存优化程序的运行效率?
18 | 案例篇:内存泄漏了,我该如何定位和处理?
19 | 案例篇:为什么系统的Swap变高了(上)
20 | 案例篇:为什么系统的Swap变高了?(下)
21 | 套路篇:如何“快准狠”找到系统内存的问题?
22 | 答疑(三):文件系统与磁盘的区别是什么?
I/O 性能篇 (10讲)
23 | 基础篇:Linux 文件系统是怎么工作的?
24 | 基础篇:Linux 磁盘I/O是怎么工作的(上)
25 | 基础篇:Linux 磁盘I/O是怎么工作的(下)
26 | 案例篇:如何找出狂打日志的“内鬼”?
27 | 案例篇:为什么我的磁盘I/O延迟很高?
28 | 案例篇:一个SQL查询要15秒,这是怎么回事?
29 | 案例篇:Redis响应严重延迟,如何解决?
30 | 套路篇:如何迅速分析出系统I/O的瓶颈在哪里?
31 | 套路篇:磁盘 I/O 性能优化的几个思路
32 | 答疑(四):阻塞、非阻塞 I/O 与同步、异步 I/O 的区别和联系
网络性能篇 (13讲)
33 | 关于 Linux 网络,你必须知道这些(上)
34 | 关于 Linux 网络,你必须知道这些(下)
35 | 基础篇:C10K 和 C1000K 回顾
36 | 套路篇:怎么评估系统的网络性能?
37 | 案例篇:DNS 解析时快时慢,我该怎么办?
38 | 案例篇:怎么使用 tcpdump 和 Wireshark 分析网络流量?
39 | 案例篇:怎么缓解 DDoS 攻击带来的性能下降问题?
40 | 案例篇:网络请求延迟变大了,我该怎么办?
41 | 案例篇:如何优化 NAT 性能?(上)
42 | 案例篇:如何优化 NAT 性能?(下)
43 | 套路篇:网络性能优化的几个思路(上)
44 | 套路篇:网络性能优化的几个思路(下)
45 | 答疑(五):网络收发过程中,缓冲区位置在哪里?
综合实战篇 (13讲)
46 | 案例篇:为什么应用容器化后,启动慢了很多?
47 | 案例篇:服务器总是时不时丢包,我该怎么办?(上)
48 | 案例篇:服务器总是时不时丢包,我该怎么办?(下)
49 | 案例篇:内核线程 CPU 利用率太高,我该怎么办?
50 | 案例篇:动态追踪怎么用?(上)
51 | 案例篇:动态追踪怎么用?(下)
52 | 案例篇:服务吞吐量下降很厉害,怎么分析?
53 | 套路篇:系统监控的综合思路
54 | 套路篇:应用监控的一般思路
55 | 套路篇:分析性能问题的一般步骤
56 | 套路篇:优化性能问题的一般方法
57 | 套路篇:Linux 性能工具速查
58 | 答疑(六):容器冷启动如何性能分析?
加餐篇 (4讲)
加餐(一) | 书单推荐:性能优化和Linux 系统原理
加餐(二) | 书单推荐:网络原理和 Linux 内核实现
用户故事 | “半路出家 ”,也要顺利拿下性能优化!
用户故事 | 运维和开发工程师们怎么说?
结束语 (1讲)
结束语 | 愿你攻克性能难关
Linux性能优化实战
登录|注册

35 | 基础篇:C10K 和 C1000K 回顾

倪朋飞 2019-02-11
你好,我是倪朋飞。
前面内容,我们学习了 Linux 网络的基础原理以及性能观测方法。简单回顾一下,Linux 网络基于 TCP/IP 模型,构建了其网络协议栈,把繁杂的网络功能划分为应用层、传输层、网络层、网络接口层等四个不同的层次,既解决了网络环境中设备异构的问题,也解耦了网络协议的复杂性。
基于 TCP/IP 模型,我们还梳理了 Linux 网络收发流程和相应的性能指标。在应用程序通过套接字接口发送或者接收网络包时,这些网络包都要经过协议栈的逐层处理。我们通常用带宽、吞吐、延迟、PPS 等来衡量网络性能。
今天,我们主要来回顾下经典的 C10K 和 C1000K 问题,以更好理解 Linux 网络的工作原理,并进一步分析,如何做到单机支持 C10M。
注意,C10K 和 C1000K 的首字母 C 是 Client 的缩写。C10K 就是单机同时处理 1 万个请求(并发连接 1 万)的问题,而 C1000K 也就是单机支持处理 100 万个请求(并发连接 100 万)的问题。

C10K

C10K 问题最早由 Dan Kegel 在 1999 年提出。那时的服务器还只是 32 位系统,运行着 Linux 2.2 版本(后来又升级到了 2.4 和 2.6,而 2.6 才支持 x86_64),只配置了很少的内存(2GB)和千兆网卡。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Linux性能优化实战》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(33)

  • Maxwell
    一台机器不是只有65536个端口吗,每个网络请求都需要消耗一个端口,这样大于65536个请求会不会导致端口不够用呢?

    作者回复: 如果是只有一个IP地址的客户端,那的确是受限于端口数量。

    不过,如果是服务器端,那可以接受的连接就多得多了(组合客户端IP+端口)。

    2019-02-20
    14
  • select/poll是LT模式,epoll缺省使用的也是水平触发模式(LT)。
    目前业界对于ET的最佳实践大概就是Nginx了,单线程redis也是使用的LT
    说下我对水平触发(LT)和边缘触发(ET)我的理解。
    LT:文件描述符准备就绪时(FD关联的读缓冲区不为空,可读。写缓冲区还没满,可写),触发通知。
    也就是你文中表述的"只要文件描述符可以非阻塞地执行 I/O ,就会触发通知..."
    ET:当FD关联的缓冲区发生变化时(例如:读缓冲区由空变为非空,有新数据达到,可读。写缓冲区满变有空间了,有数据被发送走,可写),触发通知,仅此一次
    也就是你文中表述的"只有在文件描述符的状态发生改变(也就是 I/O 请求达到)时"

    2019-04-08
    8
  • Days
    总结:通过对C10K 和 C100K案例分析,总结了常见的IO模型实现框架,比较基础知识补充!
    2019-02-11
    4
  • 涛涛
    10k并发:epoll+线程池;
    100K:增加物理资源;
    1000k:更高的系统优化(软件的功能交给专业硬件);
    10mk:dpdx xdp
    2019-04-28
    3
  • 挺直腰板
    老师,很多人都说并发数不能超过65536,假如访问服务器80端口,服务器ip是183.3.226.35这个,客户端ip是58.62.30.2,超过65536端口如何显示,是这样183.3.226.35 58.62.30.2:80?单机最大并发的连接数据是多少?谢谢!

    作者回复: 注意区分客户端还是服务器端:客户端使用单个IP去访问服务器的时候,端口号数是最大限制;服务器端没有这个限制。

    2019-03-31
    1
    3
  • AI杜嘉嘉
    老师,您好。我看IO模型这块老提到文件描述符,这个跟IO模型有啥关系呢?

    作者回复: 还记得虚拟文件系统(VFS)吧,使用套接字接口的时候,也是要分配一个文件描述符,然后后续所有的I/O都通过这个文件描述符来操作(包括IO模型中要判断可读写状态)。

    2019-02-22
    2
  • 小花
    一个请求16kb,请问这个是怎么预估出来,或者任意一个请求,我如何判断它的大小?
    2019-09-02
    1
  • 科学Jia
    老师,问题1: DPDK和XDP,是不是在qps不能上去的情况下都可以采用的方案?问题2:DPDK和XDP是linux需要额外配置的工具么?

    作者回复: 是的,都需要额外的开发

    2019-03-04
    1
  • 我来也
    [D35打卡]
    09年那会,我所在公司的服务器端都是单进程+select.
    后来把select换为了poll和epoll.
    再后来还拆分成了多进程,N个网络收发层+M个业务处理层.
    毕竟我们的情况是 业务处理的耗时远大于网络收发的耗时.
    目前的网络收发层也只支持最大65530个并发连接,毕竟是单ip单端口的.
    如果想支持更多并发连接,就另外再开一个进程.
    并没有往C100K甚至是C1000K的方向上努力了.

    作者回复: 其实并不是 65530,Linux使用五元组标志一个连接:协议、源IP、源端口、目的IP、目的端口。根据这些,你可以算下理论上最大支持的连接数。

    2019-02-12
    1
  • zzyalbert
    为什么select是o(n^2)poll是o(n)?
    2019-08-27
  • GeekCoder
    想问一下c10,c1000k,c10m这些都是基于什么服务器配置?比如怎么样的服务器实现了

    作者回复: c10k对服务器要求很低,甚至个人开发机都可以;c10m对硬件有一些要求,比如需要支持dpdk的网卡

    2019-08-21
  • JJj
    请问下在 poll内部,检查套接字状态不是用轮询方法吗?为什么时间复杂度是O(N)

    作者回复: poll需要轮询查询每个fd的状态,所以时间复杂度是O(N),N是fd的个数

    2019-07-06
  • k
    那性价比最高的C1000K方案是不是epoll多线程+dpdk?这样好像也不需要对硬件进行过多的优化

    作者回复: 嗯嗯,其实DPDK本身就包含了大量的软硬件优化

    2019-07-03
  • GaelYang
    原文中 C10K 和 C1000K 的首字母 C 是 Client的缩写。
    C可能是concurrtently 的缩写 ?

    作者回复: 都可以

    2019-07-02
  • bigzuo
    内容非常赞!
    2019-06-20
  • A孙其成
    到了硬骨头了,网络不太懂,努力学习
    2019-06-06
  • kubxy
    老师,我是疑问是TCP连接和HTTP请求的关系,一万并发请求需要建立一万个TCP连接吗?即一个TCP连接同一个时间点只能发送一个HTTP请求,是这样吗?

    作者回复: HTTP2支持多路复用

    2019-05-27
  • 懵懂的Java
    老师你好,前段再多的请求数,如果后段数据库连接池设置的很小比如200最多并发不也就是200吗,不知道我理解的对不对

    作者回复: 不对,不是每个请求都会直接发送给数据库

    2019-05-24
  • 如果
    DAY35,打卡
    2019-03-25
  • 深海极光
    老师你好,您说到epoll 的边缘触发只在文件描述符可读或可写事件发生时才通知,那么应用程序就需要尽可能多地执行 I/O,并要处理更多的异常事件,我有点不理解这个多执行IO是为什么?是指有一个文件描述符也就是链接可读或者可写时就通知应用程序一次,那么有100个链接同时都可读,就通知应用程序100次吗,应用程序拿到这100个都是可读的。并没有多的IO执行啥,还请老师解惑,谢谢!

    作者回复: 因为一次读有可能不会读到所有数据,但这种情况不会有新的事件通知了

    2019-03-19
收起评论
33
返回
顶部