# C10K编程
比较传统的服务端程序(PHP、FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放。由于进程创建、销毁对资源占用比较高,所以很多语言都通过常驻进程、线程等方式降低资源开销。即使是资源占用最小的线程,当并发数量超过1k的时候,操作系统的处理能力就开始出现明显下降,因为有太多的CPU时间都消耗在系统上下文切换。
由此催生了C10K编程,指的是服务器同时支持成千上万个连接,也就是concurrent 10 000 connection(这也是C10K这个名字的由来)。由于硬件成本的大幅度降低和硬件技术的进步,加上一台服务器同时能够服务更多的客户端,就意味着服务每一个客户端的成本大幅度降低,从这个角度来看,C10K问题显得非常有意义。
理想情况下,具备C10K能力的服务端处理能力是c1k的十倍,返回来说我们可以减少90%的服务器资源,多么诱人的结果。
C10K解决了这几个主要问题:
- 单个进程或线程可以服务于多个客户端请求
- 事件触发替代业务轮询
- IO采用非阻塞方式,减少额外不必要性能损耗
C10K编程的世界,一定是异步编程的世界,他俩绝对是一对儿好基友。服务端一直都不缺乏新秀,各种语言、框架层出不穷。笔者了解的就有OpenResty,Golang,Node.js,Rust,Python(gevent)等。每个语言或解决方案,都有自己完全不同的定位和表现,甚至设计哲学。但是他们从系统底层API应用、基本结构,都是相差不大。这些语言自身的实现机理、运行方式可能差别很大,但只要没有严重的代码错误,他们的性能指标都应该是在同一个级别的。
如果你用了这些解决方案,发现自己的性能非常低,就要好好看看自己是不是姿势有问题。
> c1k --> C10K --> c100k --> ???
人类前进的步伐,没有尽头的,总是在不停的往前跑。C10K的问题,早就被解决,而且方法还不止一个。目前方案优化手段给力,做到c100k也是可以达到的。后面还有世界么?我们还能走么?
告诉你肯定是有的,那就是c10m。推荐大家了解一下[dpdk](http://www.dpdk.eu)这个项目,并搜索一些相关领域的知识。要做到c10m,可以说系统网络内核、内存管理,都成为瓶颈了。所以要揭竿起义,统统推到重来。直接操作网卡绕过内核对网络的封装,直接使用用户态内存,再次绕过系统内核。
c10m这个动作比较大,而且还需要特定的硬件型号支持(主要是网卡,网络处理嘛),所以目前这个项目进展还比较缓慢。不过对于有追求的人,可能就要两眼放光了。
前些日子dpdk组织国内CDN厂商开了一个小会,阿里的朋友说已经用这个开发出了c10m级别的产品。小伙伴们,你们怎么看?心动了,行动不?
- 序
- Lua 入门
- Lua简介
- Lua环境搭建
- 基础数据类型
- 表达式
- 控制结构
- if/else
- while
- repeat
- for
- break,return
- Lua函数
- 函数的定义
- 函数的参数
- 函数的返回值
- 函数回调
- 模块
- String库
- Table库
- 日期时间函数
- 数学库函数
- 文件操作
- 元表
- 面向对象编程
- FFI
- 下标从1开始
- 局部变量
- 判断数组大小
- 非空判断
- 正则表达式
- 不用标准库
- 虚变量
- 函数在调用代码前定义
- 抵制使用module()函数来定义Lua模块
- 点号与冒号操作符的区别
- Nginx
- Nginx 新手起步
- location 匹配规则
- if 是邪恶的
- 静态文件服务
- 日志服务
- 反向代理
- 负载均衡
- 陷阱和常见错误
- 环境搭建
- Windows平台
- CentOS平台
- Ubuntu平台
- Mac OS X平台
- Hello World
- 简单API Server框架
- 获取Nginx内置绑定变量
- LuaRestyRedisLibrary
- select+set_keepalive组合操作引起的数据读写错误
- redis接口的二次封装(简化建连、拆连等细节)
- redis接口的二次封装(发布订阅)
- pipeline压缩请求数量
- script压缩复杂请求
- LuaCjsonLibrary
- json解析的异常捕获
- 稀疏数组
- 空table编码为array还是object
- 跨平台的库选择
- PostgresNginxModule
- 调用方式简介
- 不支持事务
- 超时
- 健康监测
- SQL注入
- LuaNginxModule
- 执行阶段概念
- 正确的记录日志
- 热装载代码
- 阻塞操作
- 缓存
- sleep
- 定时任务
- 禁止某些终端访问
- 请求返回后继续执行
- 调试
- 调用其他C函数动态库
- 我的lua代码需要调优么
- 变量的共享范围
- 动态限速
- shared.dict 非队列性质
- 如何添加自己的lua api
- 正确使用长链接
- 如何引用第三方resty库
- 典型应用场景
- LuaRestyDNSLibrary
- 使用动态DNS来完成HTTP请求
- 缓存失效风暴
- 测试
- 单元测试
- API测试
- 性能测试
- 持续集成
- 灰度发布
- Web 服务
- API的设计
- 数据合法性检测
- 协议无痛升级
- 代码规范
- 连接池
- C10K编程
- TIME_WAIT问题
- 与Docker使用的网络瓶颈
- 火焰图
- 什么时候使用
- 显示的是什么
- 如何安装火焰图生成工具
- 如何定位问题
- 开源文化对360企业安全的影响