高并发服务器开源项目,高并发服务器框架详解 - osc_qgfjs4a5的个人空间 - OSCHINA - 中文开源技术交流社区...
1)如何设计如何扩展
2)什么是高并发
(1)任务:完成某个功能的一个一个目标任务,服务器程序也是不例外的。
(2)CPU核心:完成具体任务的,是CPU核心 + 周围的外设(读写磁盘IO、网络IO) + 内存
(3)每个CPU核心可以同时调度不同的任务,如:I7双核:同时调度2个可以调度的任务;
提升单个核心主频(摩尔定律) + CPU的数目(不同核心处理不同的任务),从而处理性能;
服务器专门用的机器:32多个核心,同时调度32个不同的任务 “同时执行”;
OS-->分配核心--》调度可以被调度的任务(线程),一个线程--》任务--》OS会分配核心去调度执行它。
我们有几个核心,你就可以调度多个线程
(4)高并发:
处理一个任务,一个核心,我们需要0.3s。 假如,双核,1s可以处理多少个业务呢?
并发数量:1个CPU核心处理一个任务需要0.25s,那么一个核心可以处理4个任务;4个任务*2 = 8个任务, 1s可以并发8个任务。
例子1:但是有时候,我们无法接近个任务,什么情况下我们无法做到8个任务呢:
如果我们把这些任务放到了一个OS可以调度的线程里面:
main(){
while(网络事件){
...// 1s只能处理4个任务,这个代码永远只有1个核心来处理这个任务。--》1s最多是处理4个任务。
}
}
同样的硬件,不同的代码,写出来的服务器的处理能力就不一样。由于我们的设计没有做到--》50%的CPU在休息。
结论: 我们要使用多线程 or 多进程,增加我们的os可调度的单元,能发挥我们的多核的优势。
例子2:处理一个IO的任务,CPU把内存的数据--》磁盘驱动--》磁盘IC数据持久化到我们的磁盘--》数据就存到这个磁盘了;
WriteFile("内存数据", 文件)--》CPU--》内存数据--》磁盘的驱动(比较快0.001s完成)--》等待磁盘IC控制磁头,将内存的
数据持久化到硬盘上。
假设WriteFile需要0.25s,CPU是0.001s干完,其余0.249s就无事可干。
假设我们的CPU是一个核心,任务WriteFile 0.25 = 0.001 + 0.249(等待磁盘处理的时间),CPU的实际工作只有0.001s,
CPU 0.249s可以做其它事情,我们的代码等在了IO上面。
我们并发的业务: 1/0.25s = 4次,CPU都是等待,我们本来可以让CPU做其它事情,但是你让它等待了。
不让它等待:
(1)加多线程、多进程,OS调度CPU核心做其它的任务--》提供了业务并发。
(2)采用异步:不傻等WriteFile完成,而是提交完0.001s,马上返回去做别的。磁盘你去存就可以了。
异步也是增加了线程。 和多线程本质并没有其它的区别。
结论:当我们等待外部设备处理完成后,才能继续下一个任务的时候,我们要提供更多的调度单元,让OS去调度CPU去完成其它任务。
就跟快递员一样,不用傻等,而是去给其它人去派送。
我们就可以多个线程,不要让CPU没有任务可做。
代码问题、、、等待外设。。。这2个例子。
(5)一定不要傻等在一个任务上,你要做一个可以调度的单元,让OS去调度其它任务--》并发:
10个快递--》0.25 0.001--》0.249
0.001-->A
0.001-->B
0.001-->C
0.001-->D
0.001-->E
0.001-->F
...
0.001-->10人-->0.001s
那么:0.01 + 0.249--》0.259s就可以完成调度。 而1个一个的派送,则需要2.5s
(6)安排足够的任务(线程)--》给足够的核心去调度。
32核心: 就安排了6个核心去调度,那么大部分核心都在睡觉。
(7)增加调度单元:
多线程调度:根据核心数目,来运行我们的代码,16核心和32核心,是一样的。
多进程来部署:让不同的东西部署到不同的进程上。
3)服务器多线程架构
多线程去处理网络请求, 成千上万个客户端。
哪个线程去处理哪个事件。
别再派送一个快递的时候,别的快递都傻等到这里了。有核心,没有任务。
4)多台服务器,如何部署
(1)内部快展
地图A
地图B
...
地图副本服务器
假设只能买到4核心,
代码不用变。按照逻辑功能,划分到不同的分区。
机器1:通用服务
机器2:地图1服务
机器3:地图2服务
返回对应的连接。 让不同的机器跑不同的任务。
分区调度器--》单服。 足够多的任务可以被OS调度到。 客户端连接的不同的地址的服务器而已。
高并发服务器开源项目,高并发服务器框架详解 - osc_qgfjs4a5的个人空间 - OSCHINA - 中文开源技术交流社区...相关推荐
- java -p_javap命令详解 - JackieYeah的个人空间 - OSCHINA - 中文开源技术交流社区
一.用法 javap [ 选项 ] classes 二.描述 javap命令反汇编一个或多个类文件.它的输出由使用的选项决定.如果没有使用选项,javap命令将打印输出传递给它的类的包, protec ...
- java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...
java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...
- python写等腰三角形的性质_杨辉三角—知识点详解 - osc_8cfq8uoa的个人空间 - OSCHINA - 中文开源技术交流社区...
杨辉三角 杨辉三角(欧洲叫帕斯卡三角)是一个很奇妙的东西,它是我国数学家杨辉在1261年发现的,欧洲的帕斯卡于1654年发现,比我国的巨佬数学家杨辉晚了393年.(在此show一下我的爱国情怀) 铺垫 ...
- linux7的mcelog在哪,mcelog用法详解 - osc_bgoqj0sj的个人空间 - OSCHINA - 中文开源技术交流社区...
手动启动mcelog方法: # mcelog --daemon Run mcelog in daemon mode, waiting for errors from the kernel. 后台服务启 ...
- php框架大全图解_PHP框架汇总 - 鱼煎的个人空间 - OSCHINA - 中文开源技术交流社区...
PHP C 扩展 (Phalcon)https://phalconphp.com/zh/ Zephir/C 扩展的加载与 PHP web 服务器守护进程启动进程一次 类和函数提供的扩展都准备好要使用的 ...
- dw main.less php,less基础详解 - Python测试和开发 - OSCHINA - 中文开源技术交流社区
1.初识less less作为一门CSS扩展语言,也就是说CSS预处理器.(Leaner Style Sheets)简称less,它只不过是为css新增这些的功能,比如说:变量.函数.作用域等等.它的 ...
- [Pytorch系列-69]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - test.py代码详解
作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:[Pytorch系列-66]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleG ...
- 最新JAVA性能调优实战教程_java性能调优实战 - osc_9z8xc00s的个人空间 - OSCHINA - 中文开源技术交流社区...
在项目压测过程中,发现系统占用,上下文切换非常频繁,在此记录下调优过程,希望对后来人有所帮助. 测试方法:模拟客户端实际操作,向服务器高并发发送数据,查看服务器的负载情况. 服务器基本配置如下 1,基 ...
- leip与mysql数据库_性能分析方法 - osc_xm8bu282的个人空间 - OSCHINA - 中文开源技术交流社区...
一.性能分析的常用手段 1.空间换时间,利用内存缓存从磁盘上取出的数据,CPU可以直接访问内存,从而比从磁盘读取数据更高的效率. 2.时间换空间,当空间成为瓶颈的时候,切开数据分批次处理,用更少空间完 ...
最新文章
- cocostudio UI编辑器中UITextField输入框控件光标
- gitk、Git GUI 图形化工具中文显示乱码的解决方案
- GDCM:gdcm::VL 的测试程序
- mysql超大表处理方式是_第29问:MySQL 的复制心跳说它不想跳了
- Linux 命令学习Tips
- in-source builds are not allowed
- JAMA:Java矩阵包
- 在OneNote中快速插入当前日期和时间
- Flash MX 认证考试(样题)
- 缺陷管理工具JIRA和禅道对比
- win10专业版激活方法——亲测可行!!!
- 【综合实训】图书管理系统——概要设计说明书
- 坚持早睡早起,我收获了...
- java创建窗口_java如何创建一个窗口出来
- B75经典门户商业版Discuz模板下载
- Burst(突发)信号详解
- MYSQL间隙锁详解
- html自动定时弹窗,html网页弹窗代码 setinterval 定时任务啊
- 笔记本电脑的触摸区域操作
- “三只猫,三分钟,捉三只老鼠,多少只猫,一百分钟,捉一百只老鼠”有感
热门文章
- python requests post请求_Python“requests”模块中的POST请求无法正常工作
- linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务
- 修复ubuntu中其他盘不能挂载
- js进阶 14-6 $.ajax()方法如何使用
- 优化Angularjs的$watch方法
- RHEL4As RAC手记
- H5本地储存Web Storage
- cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...
- 如何退出vim编辑器?
- Perl 读取特定格式的文件名