一个好的网站,不仅仅是实现了功能,还应该有良好的性能。包括高可用,极端情况断电,自然灾害,部分服务器挂掉的情况不影响正常提供服务。还包括大并发的支持,面对上千万的访问量还能还能正常提供服务。当然,很多网站不会面对这样大的访问量,但是追求大并发,高流量下的性能,应该成为每个开发人员努力的方向。

性能参考

单机性能
  • CPU:有的应用需要大量计算,他们会长时间、不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题。例如,代码递归导致的无限循环,正则表达式引起的回溯,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙。

  • 内存:读写速度很快,但是成本过高。内存泄露,过多的全局变量等内存开销,可能耗尽内存,从而影响服务正常运行。

  • 磁盘IO:磁盘存储空间比内存大,但是速度比内存慢。过多的IO操作会降级服务的性能。

  • 网络:网络是互联网的经脉,是否畅通高效直接影响服务性能。

  • 数据库:大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 I/O 的读写。大量的数据库读写操作,会导致磁盘 I/O 性能瓶颈,进而导致数据库操作的延迟性。对于有大量数据库读写操作的系统来说,数据库的性能优化是整个系统的核心。

  • 代码实现的强壮型:如果代码在边际条件出现异常,将影响服务的正常服务。

  • 算法及锁。高效的算法,对大运算程序影响很显著。并发编程共享读写同一资源会用到锁,锁的使用可能会带来上下文切换,从而给系统带来性能开销。

集群性能

我们上面提到单机的性能标准,无外乎CPU,内存,IO的平均负载情况。当有上千万的并发访问量时,一台主机无能如何是扛不住的,因此就会用到集群。集群利用负载均衡,有效的减轻了单机负载压力。集群应该考虑好高可用和数据同步的问题。

  • 高可用:当有部分服务器出现问题,不应该影响提供完整功能服务。常见的高可用方案有Nginx,HaProxy。

  • 数据同步:集群方案中,数据库不是存储在一台主机上。这样可以保证数据的安全,当一台数据库主机出现故障时,可以利用另一台恢复。数据库同步可以主从同步,但这个情况会出现从服务器和主服务器数据不一致的时间延迟。可以用写同步解决主从同步的问题,但是写同步要多台数据库写完才返回,造成数据库吞吐率下降。

  • 认证和授权:如何保证集群的服务一个认证入口。一次授权,所有的集群主机都能授权。而且保证独立访问单机时,认证授权不被绕过。

  • 网络安全:集群主机之间通信的安全。这个单机也需要考虑。

性能测试指标

  • 响应时间:响应时间分数据库响应时间,服务端响应时间,网络响应时间,客户端响应时间(JS执行逻辑,渲染等)

  • 吞吐量:在测试中,我们往往会比较注重系统接口的 TPS(每秒事务处理量)。TPS分为磁盘TPS和网络TPS。网络TPS不仅仅跟带宽有关系,还跟 CPU 的处理能力、网卡、防火墙、外部接口以及 I/O 等等紧密关联。

  • 计算机资源分配使用率:通常由 CPU 占用率、内存使用率、磁盘 I/O、网络 I/O 来表示资源使用率。这几个参数好比一个木桶,如果其中任何一块木板出现短板,任何一项分配不合理,对整个系统性能的影响都是毁灭性的。

  • 负载承受能力:当系统压力上升时,你可以观察,系统响应时间的上升曲线是否平缓。这项指标能直观地反馈给你,系统所能承受的负载压力极限。例如,当你对系统进行压测时,系统的响应时间会随着系统并发数的增加而延长,直到系统无法处理这么多请求,抛出大量错误时,就到了极限。

一些检测手段

1,查看系统平均负载

在Linux和类Unix系统中,我们可以通过wuptime查看系统平均负载,下面是MacOS执行uptime命令的结果,后面三个数表示系统1分钟,5分钟,10分钟的平均负载。

16:45  up  7:26, 2 users, load averages: 2.07 1.94 2.06

2,查看CPU和内存情况。

可用用cat /proc/cpuinfo查看单机的CPU信息,用free -m查看内存使用情况。top命令是Linux监控命令,可以看到CPU,内存,虚拟内存,网络吞吐量,磁盘IO,进程调度情况。

3,硬盘及IO监控

通过df -hl查看磁盘使用情况,du命令查看目录占用磁盘情况。iostat可以监控IO负载情况。下面是MacOS下iostat输出。

         disk0               disk2       cpu    load average
    KB/t  tps  MB/s     KB/t  tps  MB/s  us sy id   1m   5m   15m
   89.54  183 15.98    26.48    0  0.00  14  7 79  2.12 2.21 2.17

4,网络响应时间

可以通过工具speedtest测试。curl命令加-w可以查看很详细的响应时间。

(.venv) xufan in ~/CatsAction on master ● ● ● λ curl -w "%{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}" www.baidu.com
......
......
0.012914::0.020047::0.026661::0.026903::91576.000%

一些思路

  • 不要过早优化,前期应该从软件工程的角度去开发。有性能拼劲的时候才着手优化。
  • 不要想着简单扩容内存提升性能,也有很多IO操作设计到磁盘和网络,具体情况具体分析。
  • 性能分析过早分析底层。应该着眼全局,从应用层,网络,IO,然后才是一些核心参数和算法。

Published

Category

性能优化

Tags

Stay in Touch

Friendship Links