网站seo关键词排名优化,网页设计制作一个网站,网上国网推广方案怎么写,通州商城网站建设点击上方蓝色字体#xff0c;关注我们菜菜哥#xff0c;有个事你还得帮我呀呦西#xff0c;YY妹子#xff0c;最近天这么热了#xff0c;你怎么还穿这么多#xff1f;苦笑一下.....前几天写了几个接口#xff0c;领导让提高一下接口吞吐量这是你技术提高的大好机会呀可吞… 点击上方蓝色字体关注我们菜菜哥有个事你还得帮我呀呦西YY妹子最近天这么热了你怎么还穿这么多苦笑一下.....前几天写了几个接口领导让提高一下接口吞吐量这是你技术提高的大好机会呀可吞吐量是什么呀怎么提高呢来凑近一点哥给你解释一番吞吐量定义百科吞吐量是指对网络、设备、端口、虚电路或其他设施单位时间内成功地传送数据的数量以比特、字节、分组等测量。 以上的定义比较宽泛定义到网站或者接口的吞吐量是这样的吞吐量是指系统在单位时间内处理请求的数量。这里有一个注意点就是单位时间内对于网站的吞吐量这个单位时间一般定义为1秒也就是说网站在一秒之内能处理多少httphttps/tcp请求。与吞吐量对应的衡量网站性能的还有响应时间、并发数、QPS每秒查询率。响应时间是一个系统最重要的指标之一它的数值大小直接反应了系统的快慢。响应时间是指执行一个请求从开始到最后收到响应数据所花费的总体时间。并发数是指系统同时能处理的请求数量这个也是反应了系统的负载能力。每秒查询率(QPS)是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准在因特网上作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec即每秒的响应请求数也即是最大吞吐能力。 我们以高速收费站为例子也许更直观一些吞吐量就是一天之内通过的车辆数响应时间就是车速并发数就是高速上同时奔跑的汽车数。由此可见其实以上几个指标是有内在联系的。比如响应时间缩短在一定程度上可以提高吞吐量。其实以上几个指标主要反映了两个概念1. 系统在单位时间之内能做多少事情2. 系统做一件事情需要的时间提高吞吐量以下场景都是在假设程序不发生异常的情况下服务器进程级别 服务器级别增加网站吞吐量也是诸多措施中最容易并且是效果最好的如果一个网站能通过增加少量的服务器来提高吞吐量菜菜觉得是应该优先采用的。毕竟一台服务器的费用相比较一个程序员费用来说要低的多。但是有一个前提就是你的服务器是系统的瓶颈网站系统之后的其他系统并非瓶颈。如果你的系统的瓶颈在DB或者其他服务盲目的增加服务器并不能解决你的问题。 通过增加服务器来解决你的网站瓶颈意味着你的网站需要做负载均衡如果没有运维相关人员你可能还得需要研究负载均衡的方案比如LVSNginxF5等。我曾经面试过很多入道不久的同学就提高吞吐量问题如果没有回答上用负载均衡方案的基本都pass了不要说别的这个方案就是一个基础就好比学习一个语言你连最基本的语法都不会我凭什么让你通过。有喷的同学可以留言哦其实现在很多静态文件采用CDN本质上也可以认为是增加服务器的策略线程级别 当一个请求到达服务器并且正确的被服务器接收之后最终执行这个请求的载体是一个线程。当一个线程被cpu载入执行其指令的时候在同步的状态下当前线程会阻塞在那里等待cpu结果如果cpu执行的是比较慢的IO操作线程会一直被阻塞闲置很长时间这里的很长是对比cpu的速度而言如果你想有一个直观的速度对比可以去查看菜菜以前的文章高并发下为什么更喜欢进程内缓存 当一个新的请求到来的时候如果没有新的线程去领取这个任务并执行要么会发生异常要么创建新的线程。线程是一种很稀缺的资源不可能无限制的创建。这种情况下我们就要把线程这种资源充分利用起来不要让线程停下来。这也是程序推荐采用异步的原因试想一个线程不停的在工作遇到比较慢的IO不会去等待结果而是接着处理下一个请求当IO的结果返回来得到通知的时候线程再去取IO结果岂不是能在相同时间内处理更多的请求。程序异步化非阻塞会明显提高系统的吞吐量但是响应时间可能会稍微变大 还有一点尽量减少线程上线文在cpu的切换因为线程上线文切换的成本也是比较大的在线程切换的时候cpu需要把当前线程的上下文信息记录下来用以下次调用的时候使用然后把新线程的上下文信息载入然后执行。这个过程相对于cpu的执行速度而言要慢很多。 不要拿Golang反驳以上观点golang的协程虽然是用户级别比线程更小的载体但是最终和Cpu进行交互的还是线程。 Cpu级别 在讲cpu级别之前如果有一定的网络模型的基础也许会好一些。这里大体阐述一下现代操作系统都采用虚拟寻址的方式它的寻址空间虚拟存储空间为4G2的32次方。操作系统将虚拟空间分为两类内核空间和用户空间。内核空间独立于用户空间有访问受保护的内存空间、IO设备的权限所有的用户空间共享。用户空间就是我们的应用程序运行的空间其实用户空间并没有操作各种IO设备的权限像我们平时读取一个文件本质上是委托内核空间去执行读取指令的内核空间读取到数据之后再把数据复制到程序运行的空间最后应用程序再把数据返回调用方。 通过上图大体可以看出内核会为每个I/O设备维护一个buffer同一个文件描述符读和写的buffer不同应用程序发出一个IO操作的指令其实通过了内核空间和用户空间两个部分并且发生了数据的复制操作。这个过程其实主要包含两个步骤1. 用户进程发出操作指令并等待数据2. 内核把数据返回给用户进程buffer的复制操作 根据这两个操作的不同表现所以IO模型有了同步阻塞同步非阻塞异步阻塞异步非阻塞的概念但是这里并非此文的重点所以不在展开详细介绍。 利用cpu提高系统吞吐量主要目标是提高单位时间内cpu运行的指令数避免cpu做一些无用功cpu负责把buffer的数据copy到应用程序空间应用程序再把数据返回给调用方假如这个过程发生的是一次Socket操作应用程序在得到IO返回数据之后还需要网卡把数据返回给client端这个过程又需要把刚刚得到的buffer数据再次通过内核发送至网卡通过网络传送出去。由此可见cpu把buffer数据copy到应用程序空间这个过程完全没有必要在内核空间完全可以把buffer数据直接传输至网卡这也是零拷贝技术要解决的问题。具体的零拷贝技术在这里不再展开。不要让任何设备停下来不要让任何设备做无用功通过增加cpu的个数来增加吞吐量网络传输级别 至于网络传输级别由于协议大部分是Tcp/ip所以在协议传输方面优化的手段比较少但是应用程序级别协议可以选择压缩率更好的比如采用grpc会比单纯的http协议要好很多http2 要比http 1.1要好很多。另外一方面网卡尽量加大传输速率比如千兆网卡要比百兆网卡速度更快。由于网络传输比较偏底层所以人工干预的切入点会少很多。最后总结 大部分程序员都是工作在应用层针对应用级别代码能提高吞吐量的建议1加大应用的进程数增加并发数特别在进程数是瓶颈的情况下2优化线程调用尽量池化。3应用的代码异步化特别是异步非阻塞式编程对于提高吞吐量效果特别明显4充分利用多核cpu优势实现并行编程。5减少每个调用的响应时间缩短调用链。例如通过加索引的方式来减少访问一次数据库的时间写在最后希望大家有所收获 --菜菜恭喜 安浅 QI 两位喜提上周抽奖Golang书籍。●程序员修神之路--?分布式高并发下Actor模型如此优秀?●程序员过关斩将--论商品促销代码的优雅性●程序员过关斩将--请不要随便修改基类●程序员过关斩将--你的面向接口编程一定对吗●程序员修神之路--高并发下为什么更喜欢进程内缓存●程序员修神之路--高并发优雅的做限流互联网之路菜菜与君一同成长长按识别二维码关注你点的每个在看我都认真当成了喜