zoukankan      html  css  js  c++  java
  • 提高系统性能方法论(原创)

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

    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等。建议至少掌握一门编译型语言和一门解释型语言。

  • 相关阅读:
    Qt控件SDK使用示例大全
    Qt编写地图综合应用45路径规划
    Qt编写地图综合应用43点聚合
    Qt编写地图综合应用44悬浮工具条
    Qt编写地图综合应用38覆盖物矩形
    Qt开发经验小技巧191195
    Qt编写地图综合应用41在线轮廓图
    59.学生选课管理系统
    56.音乐播放平台管理系统
    57.JAVA个人博客管理系统
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/12090598.html
Copyright © 2011-2022 走看看