保护 瞬间的压力激增,引起“雪崩效应”,系统各个部分同时崩溃,停止服务
对规模迅速增长的系统而言,容量和性能问题当然是首当其冲的
但随时间向前,增长除了性能与容量问题,还需要面对功能与模块数量上的增长带来的系统复杂性问题以及业务的变化带来的提供差异化服务问题
许多系统在架构设计时未充分考虑到这些问题,导致系统的重构成为常态,从而影响业务交付能力,还浪费人力财力!
JVM平台上的针对大数据场景(分布式计算框架)设计、优化的Garbage Collector Yak
计算机史前文明时代,y2k problem 后,世界难题 “c10k problem”
八仙过海, 各显神通
NPTL 还没有研究出来. 还不能创建成千上万个线程 windows 还在蓝屏中挣扎, 无暇顾及网络
UNIX提供了 select() 系统调用,只支持 1024 个fd, windows 只64个
这种背景下, IBM 带领着MS先搞了 IOCP
开源人有开源的做法, 在 NIH 综合症的影响下, BSD 的人敢为天下所不齿, 发明了 Kqueue, Linux 捣鼓出了 epoll
分裂, 让人头疼
都声称自己的新接口对 select 有质的提升, 是破解 c10k 问题的不二法宝,你用也得用, 不用也得用
为了让自己编写的网络程序能跨平台, 程序员开始了对3大各自为阵的法宝的膜拜学习
除了需要应对多套互不兼容的 API , 异步本身也需要更高级的抽象, 把程序员从编写异步代码的地狱模式里拯救出来
程序员们急需一个上天入地无所不能的法宝的法宝, 把这3家法宝给统御起来
率先站出来的是 ACE
5.7 新特性
介绍
5.7.7 引入 sys 系统库,专注于MySQL易用性,分析问题和定位问题,将更多的依赖sys schema,减少外部工具的使用
For Linux users I like to compare performance_schema to /proc, and SYS to vmstat.
performance schema和information schema中提供了信息源,但是,没有很好的将这些信息组织成有用的信息,从而没有很好的发挥它们的作用
重要组件buffer pool,缓存磁盘数据页,降低事务 io 代价,提高事务的执行速度,显著影响db整体性能,MySQL的每个版本都对buffer pool进行了一些改进
5.7 改进三方面
- buffer pool的dump和load
- 在线修改buffer pool
- 优化buffer pool刷盘
I/O 编程模型
用户应用程序运行在用户态,只能访问有限的内存,不能访问外围I/O设备,如硬盘、网卡等; os运行在内核态,可以访问所有内存区域以及所有外围I/O设备
用户态应用程序访问I/O需要发起系统调用,由内核线程(指令)来完成
内核线程完成相应I/O操作(读取/写入),数据需要从内核态复制到用户空间的内存,应用程序从内存获取数据,才能继续完成相应业务逻辑的执行
- 用户空间通过系统调用通知内核准备数据 -> 等待数据
- 从内核空间复制数据到用户空间 -> 拷贝数据
由于拷贝数据实在内存中进行(或者内核内存空间映射到用户空间就更快了),因此速度较快,而等待数据则是两个阶段中最消耗时间的
《Unix网络编程》 IO模型:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO
五种可单独用其中一种,也可组合使用
POSIX 只分两类:同步IO和异步IO
一个IO操作分成 发起IO请求和实际的IO操作两个步骤
阻塞和非阻塞IO区别在于第一步发起IO请求是否会被阻塞
同步和异步IO区别在于第二个步骤是否阻塞请求进程
非阻塞是os做完IO操作再将结果返回前四是同步模型,最后一种是异步模型
- 同步:指用户线程发起了I/O请求后,需一直等待或轮询内核I/O操作完成后,才会继续执行
- 异步:指用户线程发起I/O请求后依然继续执行,当内核完成I/O操作后会通知用户线程,或者回调用户线程已注册的回调函数
- 阻塞:指只有内核的I/O操作彻底完成后,才会返回用户空间
- 非阻塞:指I/O操作被调用后,立即返回一个状态值,无需等到I/O操作彻底完成
Elixir