这个话题可能看起来很枯燥,但它对mysql的性能优化非常重要。事实上我在MYSQL 咨询工作中无时无刻接不在接触这类问题。
IO工作负载与cpu依赖完全不同,尤其是当你的工作集(通常只有数据库的一小部分)载入内存的时候。当数据在内存中时读取是非常快的,如果不在内存中,则非常缓慢。例如,当你查询分析10000行数据时,如果这10000行全部加载在内存中,则只需要很短时间;但是如果到磁盘上去读的话,我们假设只有10%也就是只需要1000次随机读操作的情况下,这个查询也要花费至少5到10秒,或者在已经超负荷的情况下可能花费更多的时间。
所以在设计应用的时候就应当考虑你的应用属于哪种类型?是否能让应用充分利用CPU或者内存?如果是的话,那么任何种类的困难都不复存在,而且你或许可以采用更容易实现的解决方案。但当你设计CPU依赖型应用的时候要注意,当它规模过大时你可能负担不起更大的内存需求,同时性能还会急剧下降,而且随着复杂变化的发生你的应用访问速度可能变得糟糕。
CPU依赖在处理大量数据时比IO依赖更有优势:Count查询,分组查询,无索引排序,搜索查询等。基本上查询分析超过100行数据而且是“随机访问”大数据量的表(这样的情况下,需要频繁的物理IO操作)我想强调的是,这种查询可能会遇到性能问题。
同时,也不要只看“典型”案例,在很多情况下性能方面的问题可能就是这最糟糕的5%导致的。
让我来举个简单的例子来说明一下,假设你的应用中用户之间有某种格式的通信。您可能希望显示用户未读消息数以及邮箱中的邮件总数来至少“画出页面”,简单的解决方案是执行select count(*) from messages where user_id=134 语句或者在祝查询中使用SQL_CALC_FOUND_ROWS标记来查询相关数据。如果你的应用是CPU依赖型,那么你可能需要做的就是在数据库之上做一次缓存;如果你的应用为IO依赖型,那么你可能会有麻烦,即使邮箱中只有1000条信息也会使速度变慢。
假设现在你有一部分非常活跃的用户,他们的邮箱中邮件数可能非常多,达到一个极端,那么加载这些信息将花费很长时间--产生的负载也比普通用户多,而且由于他们对整个应用的贡献非常大所以你不想因为页面加载慢而激怒这部分用户。
所以,对于IO依赖型应用,你需要创建字段来记录信息总数、已读信息数等;需要确保同步更新这新字段(如使用触发器);确保所有查询使用order by ... limit语句索引。
对于IO依赖型应用来说,聚集索引(数据本地化)也是非常重要的--如果使用的是Innodb引擎的表,使用被auto_increment标记的自增列作索引很可能比使用如(user_id,sub_id)这种符合主键要慢,这是因为这种索引可以将user_id相同的信息聚集起来而且通常允许通过很少物理IO来查询这些数据。
你可能会认为你在CPU依赖型设计场景中也会碰到这类问题--是的,但是你可能是在100,000条信息的时候遇到性能问题而不是像IO依赖型应用中在100条信息的时候就会碰到这个问题;而这100,000条对大多数应用来说已经够用了,不用去过多考虑这个问题。
1. 本文由程序员学架构翻译
2. 本文译自Are you designing IO bound or CPU bound application ? | MySQL Performance Blog
3. 转载请务必注明本文出自:程序员学架构(微信号:archleaner )
4. 更多文章请扫码:
相关推荐
当前云计算环境中,面临的一个重要问题是,当大于CPU核数的IO(输入/输出)密集型和网络密集型应用并发执行时,传统资源分配策略未能充分考虑应用程序的特性,导致资源利用率低下和应用执行效率不高。为此,研究者...
这可以通过Maven或Gradle等构建工具完成,添加相应的依赖配置。如果没有现成的库,可能需要手动将Siger的JAR文件添加到项目的类路径中。 接下来,我们来具体看如何使用Siger获取服务器硬件信息: 1. **CPU信息**:...
了解应用是OLTP还是数据仓库类型,以便选择合适的存储配置。 2. **充足的心轴资源**:确保系统有足够的IOPS(每秒输入/输出操作)能力,以满足IO要求,并保持合理的响应时间。心轴是指能够执行IO操作的物理或逻辑...
10. **监控与日志管理**:为了确保服务的稳定性和可维护性,开发者需要监控应用的运行状态,包括CPU使用率、内存占用、错误日志等。Sina App Engine通常会提供相应的监控工具,帮助开发者诊断问题并进行优化。 总之...
* 阻塞 IO 的优点是将进程加入休眠后不会占用 CPU,缺点是发生错误信息的时候,用户无感知。 * 非阻塞 IO 的优点是发生错误信息的时候,用户可以第一时间到等待队列,缺点是会占用部分 CPU 资源,导致拉低系统的效率...
对于CPU密集型任务,这类任务主要依赖处理器进行大量的计算工作,如数学运算或算法处理。为了充分利用CPU资源,线程池的大小一般建议设置为CPU核数加一(NCPU+1)。这样的配置可以避免过多的线程上下文切换,减少...
IO密集型应用程序使用CPU资源来发出IO请求,并且通常会进入空闲状态。 在确定了应用程序类型之后,就可以开始寻找性能瓶颈的具体位置,并开始进行调优。调优的关键是识别瓶颈并针对性地采取措施,这包括调整内存...
它的核心设计理念是事件驱动和非阻塞I/O,这使得Node.js在处理IO密集型应用时表现得轻量且高效。由于Node.js运行在JavaScript上,所以学习曲线相对平缓,开发效率高。此外,Node.js依赖于V8引擎,确保了其性能和稳定...
FSM主要分为Moore型和Mealy型,Moore型状态机的状态转移与输入变量无关,而Mealy型则依赖于输入变量。FSM的设计通常有单进程和双进程两种写法。单进程FSM的优点在于结构简洁、易于编写和维护,但缺点是同步与异步...
在设计时,需要根据实际应用需求对IO端口进行配置。 复位电路设计保证了单片机在上电、死机或者其他异常情况下能够重新启动到一个确定的状态。设计复位电路时,需要考虑上电复位、手动复位以及看门狗复位等功能的...
- **STM32F103VET6**: 相比之下,具有较少的闪存和RAM资源,更适合成本敏感型应用。 **2. 时钟结构** - **STM32F103ZET6 和 STM32F103VET6**: 两者都采用了相同的时钟架构,支持多种时钟源(如外部晶体振荡器、...
《Linux内核设计与实现》读书笔记主要围绕操作系统的核心概念——进程调度展开,深入探讨了多任务操作系统的工作原理及其在Linux中的具体实现。 首先,进程调度是操作系统内核的关键部分,它的主要职责是决定哪个...
- **Schedulers.io()**:用于I/O密集型操作,如网络请求、文件读写等。 - **Schedulers.newThread()**:用于创建新线程执行任务。 ### 第七章:IOC架构设计 **7.1 依赖注入与控制反转** - **依赖注入**:一种设计...
CPU密集型数据库主要依赖CPU处理,而混合型数据库则需要平衡CPU、IO和内存的使用。根据业务需求和工作负载类型,选择合适的数据库类型同样重要。 总的来说,数据库性能模型与容量规划是一个综合性的过程,需要结合...
Prometheus是一款强大的开源监控系统和时间序列数据库,广泛应用于微服务架构和云原生环境中的服务监控。...无论你是开发微服务、大型分布式系统还是简单的企业应用,这个库都能成为你监控和维护工具箱中的重要一环。
- **Apache**:多进程服务,适合CPU密集型任务,如计算密集型应用或数据库查询。 - **Nginx**:单进程服务,适合I/O密集型任务,如视频流媒体服务。 - **Tomcat**:主要用于Java Web应用程序的部署,但静态资源处理...
在现代污水处理厂中,SIEMENS系统作为集散型控制系统的关键组成部分,其在中小型污水处理厂的应用不断拓展,特别是在提高系统可靠性、先进性、经济性和实用性方面,成为推动现代化管理的关键因素。本文将详细探讨...
在Windows Socket 5中,开发网络应用程序时,你需要了解并选择合适的I/O模型。本文将详细探讨五种不同的I/O模型:选择模型(Select)、异步选择(WSAAsyncSelect)、事件选择(WSAEventSelect)、重叠I/O...
分布式系统的缓存设计是优化大型应用性能的关键技术之一。缓存是一种存储机制,它通过将常用数据或计算结果暂存到快速访问的内存区域来减少对慢速存储(如硬盘或远程服务)的依赖,从而提升系统响应速度。本文将深入...