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 - 中文开源技术交流社区...相关推荐

  1. java -p_javap命令详解 - JackieYeah的个人空间 - OSCHINA - 中文开源技术交流社区

    一.用法 javap [ 选项 ] classes 二.描述 javap命令反汇编一个或多个类文件.它的输出由使用的选项决定.如果没有使用选项,javap命令将打印输出传递给它的类的包, protec ...

  2. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...

    java基础(2)--运算符详解 自增自减规则 自增自减就是常用的 a = a++ 或者 a = ++a;前者是后缀式,先把a赋值给a,再加一:后者是后缀式,先加一,在赋值给a;而且a++,++a并不 ...

  3. python写等腰三角形的性质_杨辉三角—知识点详解 - osc_8cfq8uoa的个人空间 - OSCHINA - 中文开源技术交流社区...

    杨辉三角 杨辉三角(欧洲叫帕斯卡三角)是一个很奇妙的东西,它是我国数学家杨辉在1261年发现的,欧洲的帕斯卡于1654年发现,比我国的巨佬数学家杨辉晚了393年.(在此show一下我的爱国情怀) 铺垫 ...

  4. linux7的mcelog在哪,mcelog用法详解 - osc_bgoqj0sj的个人空间 - OSCHINA - 中文开源技术交流社区...

    手动启动mcelog方法: # mcelog --daemon Run mcelog in daemon mode, waiting for errors from the kernel. 后台服务启 ...

  5. php框架大全图解_PHP框架汇总 - 鱼煎的个人空间 - OSCHINA - 中文开源技术交流社区...

    PHP C 扩展 (Phalcon)https://phalconphp.com/zh/ Zephir/C 扩展的加载与 PHP web 服务器守护进程启动进程一次 类和函数提供的扩展都准备好要使用的 ...

  6. dw main.less php,less基础详解 - Python测试和开发 - OSCHINA - 中文开源技术交流社区

    1.初识less less作为一门CSS扩展语言,也就是说CSS预处理器.(Leaner Style Sheets)简称less,它只不过是为css新增这些的功能,比如说:变量.函数.作用域等等.它的 ...

  7. [Pytorch系列-69]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleGAN-and-pix2pix - test.py代码详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:[Pytorch系列-66]:生成对抗网络GAN - 图像生成开源项目pytorch-CycleG ...

  8. 最新JAVA性能调优实战教程_java性能调优实战 - osc_9z8xc00s的个人空间 - OSCHINA - 中文开源技术交流社区...

    在项目压测过程中,发现系统占用,上下文切换非常频繁,在此记录下调优过程,希望对后来人有所帮助. 测试方法:模拟客户端实际操作,向服务器高并发发送数据,查看服务器的负载情况. 服务器基本配置如下 1,基 ...

  9. leip与mysql数据库_性能分析方法 - osc_xm8bu282的个人空间 - OSCHINA - 中文开源技术交流社区...

    一.性能分析的常用手段 1.空间换时间,利用内存缓存从磁盘上取出的数据,CPU可以直接访问内存,从而比从磁盘读取数据更高的效率. 2.时间换空间,当空间成为瓶颈的时候,切开数据分批次处理,用更少空间完 ...

最新文章

  1. cocostudio UI编辑器中UITextField输入框控件光标
  2. gitk、Git GUI 图形化工具中文显示乱码的解决方案
  3. GDCM:gdcm::VL 的测试程序
  4. mysql超大表处理方式是_第29问:MySQL 的复制心跳说它不想跳了
  5. Linux 命令学习Tips
  6. in-source builds are not allowed
  7. JAMA:Java矩阵包
  8. 在OneNote中快速插入当前日期和时间
  9. Flash MX 认证考试(样题)
  10. 缺陷管理工具JIRA和禅道对比
  11. win10专业版激活方法——亲测可行!!!
  12. 【综合实训】图书管理系统——概要设计说明书
  13. 坚持早睡早起,我收获了...
  14. java创建窗口_java如何创建一个窗口出来
  15. B75经典门户商业版Discuz模板下载
  16. Burst(突发)信号详解
  17. MYSQL间隙锁详解
  18. html自动定时弹窗,html网页弹窗代码 setinterval 定时任务啊
  19. 笔记本电脑的触摸区域操作
  20. “三只猫,三分钟,捉三只老鼠,多少只猫,一百分钟,捉一百只老鼠”有感

热门文章

  1. python requests post请求_Python“requests”模块中的POST请求无法正常工作
  2. linux锁定系统时间设置,Linux时间设置系统时间、硬件时间和时间服务
  3. 修复ubuntu中其他盘不能挂载
  4. js进阶 14-6 $.ajax()方法如何使用
  5. 优化Angularjs的$watch方法
  6. RHEL4As RAC手记
  7. H5本地储存Web Storage
  8. cstringw转lpctstr_CString 和 LPCTSTR 之间的转换 及 LPSTR、LPWSTR、LPCSTR、LPCWSTR、LPTSTR、LPCTSTR的区分与转化...
  9. 如何退出vim编辑器?
  10. Perl 读取特定格式的文件名