提高系统性能方法论(原创)

  看了一些提高系统性能的方法,抽象出方法论。

1. 提升性能方法论

1. 拆分

  拆分相当于企业的扩大再生产,这并没有提高企业的效率。即单个节点的处理能力并没有变化。只是把负载分给了其它节点。具体是:集群,分片。

  DNS集群,应用服务器集群,数据库读写分离,再到更细粒度的多进程等。

2. 精简

  精简是指降低单个处理占用的资源,或者减少处理流程。比如占用的内存,CPU,锁,网络,磁盘等等,从而提高单个处理的处理速度。

  进程->线程->协程,降低占用的内存和CPU。

  HTTP->RPC,精简单次请求消息体,提高有效载荷的占比,提高消息收发速度

  发送网络请求时,内核会将数据拷贝到用户内存,用户内存再将数据发给网卡,操作系统支持直接将数据从内核拷贝到网卡。好像是叫DMA。这就是简化处理流程

3. 复用

  提高资源的利用率,从而提高吞吐量和速度。

  将多进程/多线程改为IO多路复用,就可以大大降低对CPU,内存的占用。

  进程池,数据连接池的使用,由于创建进程和数据库连接耗时,重复利用可以提高速度。

  在通信中,也有频分复用,时分复用,码分复用。

4. 异步

  消息队列,buffer。其实消息队列就是一个buffer。消息队列/buffer主要解决写入慢的问题。写入时不直接写入慢的硬件,而是写入另一个快的硬件中,再异步的写入慢的硬件。将消息写入消息队列,后台有worker处理消息队列中的消息。通过将允许异步完成的操作,由同步转为异步可以提高速度。

  Kafka中有组提交,这也是异步。即写入时写到队列中,worker在等其达到指定长度或时间后会处理(提交)。

5. 缓存

  异步是解决写慢,缓存是解决读慢。不直接读慢硬件,而是缓存在快硬件中。当然,这样做需要解决两个硬件中数据的一致性。

6. 直接更换速度快的硬件

  上面讲到了缓存,还有快硬件和慢硬件,使用缓存要考虑数据一致性问题。还有一种办法是直接用快硬件完全替换慢硬件。当然,这样搞需要考虑替换后的问题。

比如用内存完全替换磁盘,数据有丢失的问题。

  3G->4G->5G

  千兆网卡->万兆网卡

  普通磁盘->SSD

  普通计算机->量子计算机

7. 读写硬件时,遵循其特性

  比如磁盘在顺序写时,比随机写的速度要快很多,那写入时就尽量使用顺序写。WAL就是顺序写

8. 使用合适的数据结构与算法

  关系数据库使用B+树

  查找时二分查找

9. 换编程语言

  我们编程时,会使用特定的编程语言,但不同的编程语言的处理速度有快慢之分。一般来说,编译型语言的速度比解释型要快。比如Go比Python快。目前,著名的开源后端服务中,大部分使用的是C/C++/Java,Python的项目也有,但基本上不是对性能要求很高的项目。我估计后面Go的开源项目也会越来越多。

2. 使用的组件和技术

  高性能系统中,会使用上面方法论中提到的方法进行优化。目前来说,使用的组件和技术有

1. 数据库分库分表和NoSQL

  MySQL没有内置分库分表功能,需要自己在业务层或通过中间件实现。NoSQL数据库很多内置了集群和分片功能,不再需要自己搞,只需要配置就行,比如Redis的cluster和sentinial,MongoDB的replica set和sharding,Kafka和ES也有类似的功能。
  有了副本集和分片后,需要保证数据的一致性,有著名的CAP原理。数据一致性协议有Paxos,Raft等。还有一致性hash。每种NoSQL数据库又涉及到很多知识和技术,当然,他们在副本集和分片的实现上有很多相似性。

2. 协程

  降低每个处理占用资源,IO多路复用。Python中的Gevent,asyncio。涉及到协程内部的具体实现,比如如何实现事件循环的

3. RPC

  提高网络请求消息中有效载荷的占比。常用的有Thrift。涉及到高效的序列化与反序列化协议等。

4. 进程池/数据库连接池

  资源复用,因为每次创建会耗时。Python的multiprocessing库。

5. buffer/消息队列

  同步变异步,提高写入速度。另外,MQ还有削峰填谷,解耦的作用。常用消息队列有Kafka,RocketMQ,RabbitMQ。
  涉及到如何保证消息只消费一次,如何保证消息不丢失,消息堆积如何解决。

6. 缓存

  提高读取速度,目前用的最多的是Memcached,Redis。
  涉及到缓存的使用策略,比如常用的Cache Aside策略。分布式锁。出现缓存穿透如何解决等等。

7. 升级CPU/内存/磁盘/网卡

  磁盘可以换成SSD。有钱你就换高端装备。

8. 顺序读/写磁盘

  最典型的是WAL

9. 数据结构与算法

  常用的是数据结构有Hash,队列,LinkedHashMap,链表,二叉树。算法有二分查找,平衡二叉树,跳表,红黑树,递归,快排。
  这块是基础,跟初级/中级程序员的关系最大,也是这两类程序员最先想到的提升性能的技术。

10. 编程语言

  互联网行业流行的有Java,Python,PHP,Go,Node等。建议至少掌握一门编译型语言和一门解释型语言。

原文地址:https://www.cnblogs.com/ajianbeyourself/p/12090598.html