精华内容
下载资源
问答
  • B2C电子商务环境提高快递服务质量策略研究 摘 要 电子商务的不断发展带动快递企业的不断发展但是彼此发展的速度还存在很大的差距为了满足电子商务的发展对快递企业的提出的新需求本文分析了目前快递企业所存在的...
  • 高并发环境下服务器该如何优化

    千次阅读 2018-07-18 22:58:49
    什么是服务器并发处理能力 一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强。   有什么方法衡量服务器并发处理...服务器一般会限制同时服务的最多用户数,比如apach...

    什么是服务器并发处理能力

    一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强。

     

    有什么方法衡量服务器并发处理能力

    1. 吞吐率

    吞吐率,单位时间里服务器处理的最大请求数,单位req/s。

     

    从服务器角度,实际并发用户数可以理解为服务器当前维护的代表不同用户的文件描述符总数,也就是并发连接数。服务器一般会限制同时服务的最多用户数,比如apache的MaxClients参数。

     

    这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望等待最少的时间,显然,双方不能满足,所以双方利益的平衡点,就是我们希望的最大并发用户数。

     

    2. 压力测试

    有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗?实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求,服务器的网卡接收缓冲区最多有100个等待处理的请求,显然这时的服务器压力更大。

     

    压力测试前提考虑的条件

    • 并发用户:指在某一时刻同时向服务器发送请求的用户总数(HttpWatch)

    • 总请求数

    • 请求资源描述

    • 请求等待时间(用户等待时间)

    • 用户平均请求的等待时间

    • 服务器平均请求处理的时间

    • 硬件环境

     

    压力测试中关心的时间又细分以下2种:

    • 用户平均请求等待时间(这里暂不把数据在网络中的传输时间,还有用户本地PC的计算时间计算入内)

    • 服务器平均请求处理时间

     

    用户平均请求等待时间主要用于衡量服务器在一定并发用户数下,单个用户的服务质量;而服务器平均请求处理时间就是吞吐率的倒数,一般来说,用户平均请求等待时间 = 服务器平均请求处理时间 * 并发用户数

     

    怎么提高服务器的并发处理能力

    1. 提高CPU并发计算能力

    服务器之所以可以同时处理多个请求,在于操作系统通过多执行流体系设计使得多个任务可以轮流使用系统资源,这些资源包括CPU,内存以及I/O。这里的I/O主要指磁盘I/O和网络I/O。

     

    多进程 & 多线程

    多执行流的一般实现便是进程,多进程的好处可以对CPU时间的轮流使用,对CPU计算和IO操作重叠利用。这里的IO主要是指磁盘IO和网络IO,相对CPU而言,它们慢的可怜。

     

    而实际上,大多数进程的时间主要消耗在I/O操作上。现代计算机的DMA技术可以让CPU不参与I/O操作的全过程,比如进程通过系统调用,使得CPU向网卡或者磁盘等I/O设备发出指令,然后进程被挂起,释放出CPU资源,等待I/O设备完成工作后通过中断来通知进程重新就绪。对于单任务而言,CPU大部分时间空闲,这时候多进程的作用尤为重要。

     

    多进程不仅能够提高CPU的并发度。其优越性还体现在独立的内存地址空间和生命周期所带来的稳定性和健壮性,其中一个进程崩溃不会影响到另一个进程。

     

    但是进程也有如下缺点:

    • fork()系统调用开销很大:prefork

    • 进程间调度和上下文切换成本:减少进程数量

    • 庞大的内存重复:共享内存

    • IPC编程相对比较麻烦

     

    减少进程切换

    当硬件上下文频繁装入和移出时,所消耗的时间是非常可观的。可用Nmon工具监视服务器每秒的上下文切换次数。为了尽量减少上下文切换次数,最简单的做法就是减少进程数,尽量使用线程并配合其它I/O模型来设计并发策略。

     

    还可以考虑使用进程绑定CPU技术,增加CPU缓存的命中率。若进程不断在各CPU上切换,这样旧的CPU缓存就会失效。

     

    减少使用不必要的锁

    服务器处理大量并发请求时,多个请求处理任务时存在一些资源抢占竞争,这时一般采用“锁”机制来控制资源的占用,当一个任务占用资源时,我们锁住资源,这时其它任务都在等待锁的释放,这个现象称为锁竞争。

     

    通过锁竞争的本质,我们要意识到尽量减少并发请求对于共享资源的竞争。比如在允许情况下关闭服务器访问日志,这可以大大减少在锁等待时的延迟时间。要最大程度减少无辜的等待时间。

     

    这里说下无锁编程,就是由内核完成这个锁机制,主要是使用原子操作替代锁来实现对共享资源的访问保护,使用原子操作时,在进行实际的写操作时,使用了lock指令,这样就可以阻止其他任务写这块内存,避免出现数据竞争现象。原子操作速度比锁快,一般要快一倍以上。

     

    例如fwrite(), fopen(),其是使用append方式写文件,其原理就是使用了无锁编程,无锁编程的复杂度高,但是效率快,而且发生死锁概率低。

     

    考虑进程优先级

    进程调度器会动态调整运行队列中进程的优先级,通过top观察进程的PR值。

     

    考虑系统负载

    可在任何时刻查看/proc/loadavg,top中的load average也可看出。

     

    考虑CPU使用率

    除了用户空间和内核空间的CPU使用率以外,还要关注I/O wait,它是指CPU空闲并且等待I/O操作完成的时间比例(top中查看wa的值)。

     

    2. 考虑减少内存分配和释放

    服务器的工作过程中,需要大量的内存,使得内存的分配和释放工作尤为重要。可以通过改善数据结构和算法复制度来适当减少中间临时变量的内存分配及数据复制时间,而服务器本身也使用了各自的策略来提高效率。

     

    例如Apache,在运行开始时一次申请大片的内存作为内存池,若随后需要时就在内存池中直接获取,不需要再次分配,避免了频繁的内存分配和释放引起的内存整理时间。

     

    再如Nginx使用多线程来处理请求,使得多个线程之间可以共享内存资源,从而令它的内存总体使用量大大减少,另外,nginx分阶段的内存分配策略,按需分配,及时释放,使得内存使用量保持在很小的数量范围。

     

    另外,还可以考虑共享内存。共享内存指在多处理器的计算机系统中,可以被不同中央处理器(CPU)访问的大容量内存,也可以由不同进程共享,是非常快的进程通信方式。

     

    但是使用共享内存也有不好的地方,就是对于多机器时数据不好统一。

     

    shell命令ipcs可用来显示系统下共享内存的状态,函数shmget可以创建或打开一块共享内存区,函数shmat将一个存在的共享内存段连接到本进程空间,函数shmctl可以对共享内存段进行多种操作,函数shmdt函数分离该共享内存。

     

    3. 考虑使用持久连接

    持久连接也称为长连接,它本身是TCP通信的一种普通方式,即在一次TCP连接中持续发送多分数据而不断开连接,与它相反的方式称为短连接,也就是建立连接后发送一份数据就断开,然后再次建立连接发送下一份数据, 周而复始。是否采用持久连接,完全取决于应用特点。

     

    从性能角度看,建立TCP连接的操作本身是一项不小的开销,在允许的情况下,连接次数越少,越有利于性能的提升; 尤其对于密集型的图片或网页等小数据请求处理有明显的加速所用。

     

    HTTP长连接需要浏览器和web服务器的共同协作,目前浏览器普遍支持长连接,表现在其发出的HTTP请求数据头中包含关于长连接的声明,如下: Connection: Keep-Alive,主流的web服务器都支持长连接,比如apache中,可以用KeepAlive off关闭长连接。

     

    对于长连接的有效使用,还有关键一点在于长连接超时时间的设置,即长连接在什么时候关闭吗? Apache的默认设置为5s, 若这个时间设置过长,则可能导致资源无效占有,维持大量空闲进程,影响服务器性能。

     

    4. 改进I/O 模型

    I/O操作根据设备的不同分为很多类型,比如内存I/O, 网络I/O, 磁盘I/O。对于网络I/O和磁盘I/O, 它们的速度要慢很多,尽管使用RAID磁盘阵列可通过并行磁盘磁盘来加快磁盘I/O速度,购买大连独享网络带宽以及使用高带宽网络适配器可以提高网络i/O的速度。

     

    但这些I/O操作需要内核系统调用来完成,这些需要CPU来调度,这使得CPU不得不浪费宝贵的时间来等待慢速I/O操作。我们希望让CPU足够少的时间在I/O操作的调度上,如何让高速的CPU和慢速的I/O设备更好地协调工作,是现代计算机一直探讨的话题。各种I/O模型的本质区别在于CPU的参与方式。

     

    1. DMA技术

    I/O设备和内存之间的数据传输方式由DMA控制器完成。在DMA模式下,CPU只需向DMA下达命令,让DMA控制器来处理数据的传送,这样可以大大节省系统资源。

     

    2. 异步I/O

    异步I/O指主动请求数据后便可以继续处理其它任务,随后等待I/O操作的通知,这样进程在数据读写时不发生阻塞。

     

    异步I/O是非阻塞的,当函数返回时,真正的I/O传输已经完成,这让CPU处理和I/O操作达到很好的重叠。

     

    3. I/O多路复用

    服务器同时处理大量的文件描述符是必不可少的,若采用同步非阻塞I/O模型,若同时接收TCP连接的数据,就必须轮流对每个socket调用接收数据的方法,不管这些socket有没有可接收的数据,都要询问一次。

     

    假如大部分socket并没有数据可以接收,那么进程便会浪费很多CPU时间用于检查这些socket有没有可以接收的数据。多路I/O就绪通知的出现,提供了对大量文件描述符就绪检查的高性能方案,它允许进程通过一种方法同时监视所有文件描述符,并可以快速获得所有就绪的文件描述符,然后只针对这些文件描述符进行数据访问。

     

    epoll可以同时支持水平触发和边缘触发,理论上边缘触发性能更高,但是代码实现复杂,因为任何意外的丢失事件都会造成请求处理错误。

     

    epoll主要有2大改进:

    epoll只告知就绪的文件描述符,而且当调用epoll_wait()获得文件描述符时,返回并不是实际的描述符,而是一个代表就绪描述符数量的值,然后只需去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里使用了内存映射(mmap)技术,这样彻底省掉了这些文件描述符在系统调用时复制的开销。

     

    epoll采用基于事件的就绪通知方式。其事先通过epoll_ctrl()注册每一个文件描述符,一旦某个文件描述符就绪时,内核会采用类似callback的回调机制,当进程调用epoll_wait()时得到通知。

     

    4. Sendfile

    大多数时候,我们都向服务器请求静态文件,比如图片,样式表等,在处理这些请求时,磁盘文件的数据先经过内核缓冲区,然后到用户内存空间,不需经过任何处理,其又被送到网卡对应的内核缓冲区,接着再被送入网卡进行发送。

     

    Linux提供sendfile()系统调用,可以讲磁盘文件的特定部分直接传送到代表客户端的socket描述符,加快了静态文件的请求速度,同时减少CPU和内存的开销。

     

    适用场景: 对于请求较小的静态文件,sendfile发挥的作用不那么明显,因发送数据的环节在整个过程中所占时间的比例相比于大文件请求时小很多。

     

    5. 内存映射

    Linux内核提供一种访问磁盘文件的特殊方式,它可以将内存中某块地址空间和我们指定的磁盘文件相关联,从而对这块内存的访问转换为对磁盘文件的访问。这种技术称为内存映射。

     

    多数情况下,内存映射可以提高磁盘I/O的性能,无须使用read()或write()等系统调用来访问文件,而是通过mmap()系统调用来建立内存和磁盘文件的关联,然后像访问内存一样自由访问文件。

     

    缺点:在处理较大文件时,内存映射会导致较大的内存开销,得不偿失。

     

    6. 直接I/O

    在linux 2.6中,内存映射和直接访问文件没有本质差异,因为数据需要经过2次复制,即在磁盘与内核缓冲区之间以及在内核缓冲区与用户态内存空间。

     

    引入内核缓冲区的目的在于提高磁盘文件的访问性能,然而对于一些复杂的应用,比如数据库服务器,它们为了进一步提高性能,希望绕过内核缓冲区,由自己在用户态空间实现并管理I/O缓冲区,比如数据库可根据更加合理的策略来提高查询缓存命中率。另一方面,绕过内核缓冲区也可以减少系统内存的开销,因内核缓冲区本身就在使用系统内存。

     

    Linux在open()系统调用中增加参数选项O_DIRECT,即可绕过内核缓冲区直接访问文件,实现直接I/O。

     

    在Mysql中,对于Innodb存储引擎,自身进行数据和索引的缓存管理,可在my.cnf配置中分配raw分区跳过内核缓冲区,实现直接I/O。

     

    改进服务器并发策略

    服务器并发策略的目的,是让I/O操作和CPU计算尽量重叠进行,一方面让CPU在I/O等待时不要空闲,另一方面让CPU在I/O调度上尽量花最少的时间。

     

    一个进程处理一个连接,非阻塞I/O

    这样会存在多个并发请求同时到达时,服务器必然要准备多个进程来处理请求。其进程的开销限制了它的并发连接数。但从稳定性和兼容性的角度,则其相对安全,任何一个子进程的崩溃不会影响服务器本身,父进程可以创建新的子进程;这种策略典型的例子就是Apache的fork和prefork模式。对于并发数不高(如150以内)的站点同时依赖Apache其它功能时的应用选择Apache还是可以的。

     

    一个线程处理一个连接,非阻塞IO

    这种方式允许在一个进程中通过多个线程来处理多个连接,一个线程处理一个连接。Apache的worker模式就是这种典型例子,使其可支持更多的并发连接。不过这种模式的总体性能还不如prefork,所以一般不选用worker模式。

     

    一个进程处理多个连接,异步I/O

    一个线程同时处理多个连接,潜在的前提条件就是使用IO多路复用就绪通知。这种情况下,将处理多个连接的进程叫做worker进程或服务进程。worker的数量可以配置,如Nginx中的worker_processes 4。

     

    一个线程处理多个连接,异步IO

    即使有高性能的IO多路复用就绪通知,但磁盘IO的等待还是无法避免的。更加高效的方法是对磁盘文件使用异步IO,目前很少有Web服务器真正意义上支持这种异步IO。

     

    6. 改进硬件环境

    还有一点要提及的是硬件环境,服务器的硬件配置对应用程序的性能提升往往是最直接,也是最简单的方式,这就是所谓的scale up。这里不做论述。

    展开全文
  • 针对现有移动网络环境下IPTV视频质量不能很好满足用户需求的缺点,提出一种面向QoE的移动IPTV视频质量优化算法。算法设计了移动IPTV的网络体系架构,负责管理...提出的优化算法能有效提高移动环境下的视频服务质量
  • Web服务器及性能优化

    万次阅读 2018-08-09 07:03:34
    二、浏览器端,关于浏览器端优化 2.1 压缩源码和图片 2.2 选择合适的图片格式 2.3 合并静态资源 2.4 开启服务器端的Gzip压缩 2.5 使用CDN 2.6 延长静态资源缓存时间 2.7 把CSS放在页面头部,把JavaScript放在页面...

    一、WEB服务器

    1.1 概述:

    Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。
    Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行。
    Apache是Web服务器而Tomcat是Java应用服务器。

    1.2 区别:

    1.2.1 Apache

    是C语言实现的,专门用来提供HTTP服务。

    特性:简单、速度快、性能稳定、可配置(代理)
    1、主要用于解析静态文本,并发性能高,侧重于HTTP服务;
    2、支持静态页(HTML),不支持动态请求如:CGI、Servlet/JSP、PHP、ASP等;
    3、具有很强的可扩展性,可以通过插件支持PHP,还可以单向Apache连接Tomcat实现连通;
    4、Apache是世界使用排名第一的Web服务器。

    1.2.2 Tomcat

    是Java开发的一个符合JavaEE的Servlet规范的JSP服务器(Servlet容器),是 Apache 的扩展。

    特性:免费的Java应用服务器
    1、主要用于解析JSP/Servlet,侧重于Servlet引擎;
    2、支持静态页,但效率没有Apache高;支持Servlet、JSP请求;
    3、Tomcat本身也内置了一个HTTP服务器用于支持静态内容,可以通过Tomcat的配置管理工具实现与Apache整合。

    1.2.3 Jboss

    应用服务器,运行EJB的J2EE应用服务器,遵循J2EE规范,能够提供更多平台的支持和更多集成功能,如数据库连接,JCA等;其对servlet的支持是通过集成其他servlet容器来实现的,如tomcat和jetty;

    1、JBoss是免费的,开放源代码J2EE的实现,它通过LGPL许可证进行发布。
    2、JBoss需要的内存和硬盘空间比较小。
    3、安装非常简单。先解压缩JBoss打包文件再配置一些环境变量就可以了。
    4、JBoss能够”热部署”,部署BEAN只是简单拷贝BEAN的JAR文件到部署路径下就可以了。如果没有加载就加载它;如果已经加载了就卸载掉,然后LOAD这个新的。
    5、JBoss与Web服务器在同一个Java虚拟机中运行,Servlet调用EJB不经过网络,从而大大提高运行效率,提升安全性能。
    6、用户可以直接实施J2EE-EAR,而不是以前分别实施EJB-JAR和Web-WAR,非常方便。

    二、浏览器端,关于浏览器端优化

    2.1 压缩源码和图片

    JavaScript文件源代码可以采用混淆压缩的方式,CSS文件源代码进行普通压缩,JPG图片可以根据具体质量来压缩为50%到70%,PNG可以使用一些开源压缩软件来压缩,比如24色变成8色、去掉一些PNG格式信息等。

    2.2 选择合适的图片格式

    如果图片颜色数较多就使用JPG格式,如果图片颜色数较少就使用PNG格式,如果能够通过服务器端判断浏览器支持WebP,那么就使用WebP格式和SVG格式。

    2.3 合并静态资源

    包括CSS、JavaScript和小图片,减少HTTP请求。有很大一部分用户访问会因为这一条而取得最大受益

    2.4 开启服务器端的Gzip压缩

    这对文本资源非常有效,对图片资源则没那么大的压缩比率。

    2.5 使用CDN

    什么是CDN?

    CDN的全称是内容分发网络。其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,提高用户访问网站的响应速度。

    CDN有别于镜像,因为它比镜像更智能,或者可以做这样一个比喻:CDN=更智能的镜像+缓存+流量导流。因而,CDN可以明显提高Internet网络中信息流动的效率。从技术上全面解决由于网络带宽小、用户访问量大、网点分布不均等问题,提高用户访问网站的响应速度。

    CDN的类型特点

    CDN的实现分为三类:镜像、高速缓存、专线。

    镜像站点(Mirror Site),是最常见的,它让内容直接发布,适用于静态和准动态的数据同步。但是购买和维护新服务器的费用较高,还必须在各个地区设置镜像服务器,配备专业技术人员进行管理与维护。对于大型网站来说,更新所用的带宽成本也大大提高了。

    高速缓存,成本较低,适用于静态内容。Internet的统计表明,超过80%的用户经常访问的是20%的网站的内容,在这个规律下,缓存服务器可以处理大部分客户的静态请求,而原始的服务器只需处理约20%左右的非缓存请求和动态请求,于是大大加快了客户请求的响应时间,并降低了原始服务器的负载。

    CDN服务一般会在全国范围内的关键节点上放置缓存服务器。

    专线,让用户直接访问数据源,可以实现数据的动态同步。

    CDN的实例

    举个例子来说,当某用户访问网站时,网站会利用全球负载均衡技术,将用户的访问指向到距离用户最近的正常工作的缓存服务器上,直接响应用户的请求。

    当用户访问已经使用了CDN服务的网站时,其解析过程与传统解析方式的最大区别就在于网站的授权域名服务器不是以传统的轮询方式来响应本地DNS的解析请求,而是充分考虑用户发起请求的地点和当时网络的情况,来决定把用户的请求定向到离用户最近同时负载相对较轻的节点缓存服务器上。

    通过用户定位算法和服务器健康检测算法综合后的数据,可以将用户的请求就近定向到分布在网络“边缘”的缓存服务器上,保证用户的访问能得到更及时可靠的响应。

    由于大量的用户访问都由分布在网络边缘的CDN节点缓存服务器直接响应了,这就不仅提高了用户的访问质量,同时有效地降低了源服务器的负载压力。

    或者一些公开库使用第三方提供的静态资源地址(比如jQuery、normalize.css)。一方面增加并发下载量,另一方面能够和其他网站共享缓存。

    采用了GCDN加速方式以后,系统会在浏览用户和您的服务器之间增加一台GCDN服务器。浏览用户访问您的服务器时,一般静态数据,如图片、多媒体资料等数据将直接从GCDN服务器读取,使得从主服务器上读取静态数据的交换量大大减少。

    为VIP型虚拟主机而特加的VPN高速压缩通道,使用高速压缩的电信<==>网通、电信<==>国际(HK)、网通<==>国际(HK)等跨网专线通道,智能多线,自动获取最快路径,极速的动态实时并发响应速度,实现了网站的动态脚本实时同步,对动态网站有一个更加明显的加速效果。

    每个网络运营商(电信、网通、铁通、教育网)均有您服务器的GCDN服务器,无论浏览用户是来自何处,GCDN都能让您的服务器展现最快的速度!另外,我们将对您的数据进行实时备份,让您的数据更安全!

    2.6 延长静态资源缓存时间

    这样,频繁访问网站的访客就能够更快地访问。不过,这里要通过修改文件名的方式,确保在资源更新的时候,用户会拉取到最新的内容。

    2.7 把CSS放在页面头部,把JavaScript放在页面底部

    这样就不会阻塞页面渲染,让页面出现长时间的空白。

    三、服务端优化

    3.1 HTML静态化

    其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站,我们无法全部手动去挨个实现,于是出现了我们常见的信息发布系统CMS,像我们常访问的各个门户站点的新闻频道,甚至他们的其他频道,都是通过信息发布系统来管理和实现的,信息发布系统可以实现最简单的信息录入自动生成静态页面,还能具备频道管理、权限管理、自动抓取等功能,对于一个大型网站来说,拥有一套高效、可管理的CMS是必不可少的。

    除了门户和信息发布类型的网站,对于交互性要求很高的社区类型网站来说,尽可能的静态化也是提高性能的必要手段,将社区内的帖子、文章进行实时的静态化、有更新的时候再重新静态化也是大量使用的策略,像Mop的大杂烩就是使用了这样的策略,网易社区等也是如此。

    同时,html静态化也是某些缓存策略使用的手段,对于系统中频繁使用数据库查询但是内容更新很小的应用,可以考虑使用html静态化来实现。比如论坛中论坛的公用设置信息,这些信息目前的主流论坛都可以进行后台管理并且存储在数据库中,这些信息其实大量被前台程序调用,但是更新频率很小,可以考虑将这部分内容进行后台更新的时候进行静态化,这样避免了大量的数据库访问请求。

    3.2 图片服务器分离

    大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。

    在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支持、尽可能少的LoadModule,保证更高的系统消耗和执行效率。

    3.3 数据库集群、库表散列

    大型网站都有复杂的应用,这些应用必须使用数据库,那么在面对大量访问的时候,数据库的瓶颈很快就能显现出来,这时一台数据库将很快无法满足应用,于是我们需要使用数据库集群或者库表散列。

    在数据库集群方面,很多数据库都有自己的解决方案,Oracle、Sybase等都有很好的方案,常用的MySQL提供的Master/Slave也是类似的方案,您使用了什么样的DB,就参考相应的解决方案来实施即可。

    上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制,于是我们需要从应用程序的角度来考虑改善系统架构,库表散列是常用并且最有效的解决方案。

    我们在应用程序中安装业务和应用或者功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再按照一定的策略对某个页面或者功能进行更小的数据库散列,比如用户表,按照用户ID进行表散列,这样就能够低成本的提升系统的性能并且有很好的扩展性。

    sohu的论坛就是采用了这样的架构,将论坛的用户、设置、帖子等信息进行数据库分离,然后对帖子、用户按照板块和ID进行散列数据库和表,最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。

    3.4 缓存

    缓存一词搞技术的都接触过,很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。

    架构方面的缓存,对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块,也可以使用外加的Squid模块进行缓存,这两种方式均可以有效的提高Apache的访问响应能力。

    网站程序开发方面的缓存,Linux上提供的Memory Cache是常用的缓存接口,可以在web开发中使用,比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享,一些大型社区使用了这样的架构。另外,在使用web语言开发的时候,各种语言基本都有自己的缓存模块和方法,PHP有Pear的Cache模块,Java就更多了,.net不是很熟悉,相信也肯定有。

    3.5 镜像

    镜像是大型网站常采用的提高性能和数据安全性的方式,镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点,数据进行定时更新或者实时更新。在镜像的细节技术方面,这里不阐述太深,有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。

    3.6 负载均衡

    负载均衡将是大型网站解决高负荷访问和大量并发请求采用的高端解决办法。
    负载均衡技术发展了多年,有很多专业的服务提供商和产品可以选择,我个人接触过一些解决方法,其中有两个架构可以给大家做参考。

    3.6.1 硬件四层交换

    第四层交换使用第三层和第四层信息包的报头信息,根据应用区间识别业务流,将整个区间段的业务流分配到合适的应用服务器进行处理。

    第四层交换功能就像是虚IP,指向物理服务器。它传输的业务服从的协议多种多样,有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上,需要复杂的载量平衡算法。在IP世界,业务类型由终端TCP或UDP端口地址来决定,在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。

    在硬件四层交换产品领域,有一些知名的产品可以选择,比如Alteon、F5等,这些产品很昂贵,但是物有所值,能够提供非常优秀的性能和很灵活的管理能力。“Yahoo中国”当初接近2000台服务器,只使用了三、四台Alteon就搞定了。

    3.6.2 软件四层交换

    大家知道了硬件四层交换机的原理后,基于OSI模型来实现的软件四层交换也就应运而生,这样的解决方案实现的原理一致,不过性能稍差。但是满足一定量的压力还是游刃有余的,有人说软件实现方式其实更灵活,处理能力完全看你配置的熟悉能力。

    软件四层交换我们可以使用Linux上常用的LVS来解决,LVS就是Linux Virtual Server,他提供了基于心跳线heartbeat的实时灾难应对解决方案,提高系统的强壮性,同时可供了灵活的虚拟VIP配置和管理功能,可以同时满足多种应用需求,这对于分布式的系统来说必不可少。

    一个典型的使用负载均衡的策略就是,在软件或者硬件四层交换的基础上搭建squid集群,这种思路在很多大型网站包括搜索引擎上被采用,这样的架构低成本、高性能还有很强的扩张性,随时往架构里面增减节点都非常容易。

    对于大型网站来说,前面提到的每个方法可能都会被同时使用到,这里介绍得比较浅显,具体实现过程中很多细节还需要大家慢慢熟悉和体会。有时一个很小的squid参数或者apache参数设置,对于系统性能的影响就会很大。

    展开全文
  • 随着检测环境的逐渐复杂,人们对监测水平和质量的要求也在不断提高。通过一般无线传感器得到的数据信息已经逐渐无法满足用户的需求。因此,将多媒体引入到传感器网络的环境监测领域中是必然趋势。本文通过对蚁群优化...
  • 摘要:云原生时代,视频直播、实时音视频通信等在线音视频服务面临各种复杂的网络环境和流量爆发式的增长,对音视频质量监控和成本优化提出新的严峻挑战。 2020年是不平凡的一年,客观来说它促进了我们音视频业务的...
    摘要:云原生时代,视频直播、实时音视频通信等在线音视频服务面临各种复杂的网络环境和流量爆发式的增长,对音视频质量监控和成本优化提出新的严峻挑战。

    2020年是不平凡的一年,客观来说它促进了我们音视频业务的爆发式增长。华为云基于大容量、低时延、全互联的媒体网络,通过全国的2000多个节点和几百T的宽带,和我们的客户一起服务了亿级在线用户。在这个过程中,通过大数据提升视频体验质量和成本优化显得尤为重要,同时华为云也积累了一些经验。今天来自华为公司,在大数据和音视频业务领域有十多年研发经验的康永红,将和大家分享云原生时代,华为云在音视频质量监控与优化方面的实践。

    本次分享主要分为四部分:

    第一部分是云原生时代如何快速构建音视频数据服务体系;

    第二部分是华为云直播和RTC音视频服务体验质量优化实践;

    第三部分会介绍华为在云原生时代是如何快速构建音视频服务全流程质量监控平台;

    最后总结和展望音视频业务体验质量的思考和技术规划。

    音视频体验发展趋势及背后技术支撑的挑战

    从音视频体验的发展趋势来看分为直播、RTC和XR三代,可以归纳为两个特点:第一点是用户体验越来越真实,传输分辨率从720P到1080P、再到XR的4K、6K、8K、乃至更大;另一点是业务要求互动性越来越强,迟延方面从30s到XR不超过100ms,对延迟要求更低。

    基于以上质量体验的发展趋势,我们需要有一个后台技术支撑。我们在使用大数据解决支撑的过程中也经历了三个阶段:首先是5年前用大数据平台解决技术问题,其次是在3年前用数据中台解决效率问题,第三个阶段是最近两年我们综合1.0、2.0时代的特点,采用“中台+可信数据服务”的数据服务中台模式解决价值问题。我们认为数据服务中台是解决业务差异性和市场不确定性的最佳框架。

    在直播中我们经常会碰到卡顿、实时音视频通话延迟等情况,这些问题都会严重影响用户体验。解决这些问题的一般方法是构建音视频质量监控平台,采集数据,用大数据的方法解决监控质量问题。在这过程中,我们又会碰到一些新的问题,比如采集数据延迟很大、丢失很多、数据不准确,此外还包括大数据算力不够、交付时延比较长等等问题。这些体验和技术问题带给我们很多挑战——包括会在什么场景出现这些问题,无法精准确定是网络问题、设备问题还是环境问题,以及这些问题影响了哪些客户等等。

    那我们要怎么解决这些问题呢?在端+边缘计算+云计算的云原生时代,技术上已经给了我们一些解决方法。最好的实践是基于“数据湖+数据服务”的云原生数据驱动能力,去解决业务差异性和市场不确定性。这套架构分为六层,我们通过这六层去解决后台系统的相对稳态及前端业务稳态之间的矛盾。

    架构落地的具体实践是基于云服务基础设施,首先我们构建了统一的音视频数据湖,同时构建从采集、生产到消费的数据价值链,通过这两者结合,支持所有同时在线的几大类服务接入,和面向内外部七类客户,以及包括运营、运维等客户数据服务的QoS、QoE、QoC等三大类七小类的场景诉求。当然仅仅基于这个架构开展体验质量优化工作是远远不够的,这只是技术上的解决方法。

    音视频服务体验优化三步走:监控、诊断、提升

    从在业务角度出发,我们认为QoE体验是一个管理的问题,我们在业务上需要做一些设计,这块我们构建了音视频服务的体验体系,大致分为两个大的阶段和三个小的阶段。两个大阶段是先诊断、再提升,在诊断中分为监控和诊断两个小阶段。

    具体展开来看,首先需要构建QoE、QoS的立体实时监控体系以及辅助AI的异常检测方法,做到实时发现问题。第二步在发现问题后用秒级诊断能力,快速诊断体验原因,这个原因可以具体到用户行为级。基于诊断结果,第三步就需要做体验提升,一般有两种方法:第一种是依靠人工经验做优化,另一种方法是智能调度,我们在面向不同行业、不同场景的情况下,基于智能调度策略在成本可控的情况下做到用户体验最优。

    基于上述体验质量优化体系,接下来我将具体展开分享华为云在视频直播和RTC实时音视频方面的体验优化实践的案例。

    音视频服务体验优化实践1——直播体验优化

    我们首先看一下华为云视频直播体验优化实践案例,我们在做到低时延、不卡顿、高清晰的同时,还实现了成本可控。总体分为三个阶段:第一阶段质量监控,第二阶段问题诊断,第三阶段体验提升。

    视频直播的质量监控,我们首先构建了覆盖流质量、体验、规模、网络、成本、设备六个维度的立体质量监控体系,涵盖了QoE、QoS、QoC三十多个指标,其中包括帧率、码率等核心的QoS指标,秒开率、卡顿率等QoE体验指标和带宽、回源率等成本QoC相关的指标。

    第二个阶段问题诊断——视频直播的秒级质量诊断,这是基于网络数据+端数据构建的直播流全链路监控体系。诊断流程贯穿了第一公里主播端监控推流帧率等QoS指标,到网络节点间帧率、码率等QoS质量指标监控,带宽回源率、成本指标,以及最后一公里观众端卡顿、秒开、黑屏等QoE指标。这样就实现端到端实时的秒级监控,如果发现异常情况可以及时反馈给顾客和调度系统,比如我们在第一公里发现帧率、码率出现异常,就通知客户在主播端进行策略调整,如果实在网络发现异常,就做一些节点用户数据调动或其他策略的优化,而当观众端出现体验异常时,智能调度系统会做调度策略的调整。以上整个全链路监控系统覆盖了12路直播全场景和全协议监控。

    直播流全链路监控系统——从第一公里、到媒体网络、再到最后一公里,整个都是可视化的,这样可以提升问题诊断的效率。

    第三步体验提升,视频直播体验提升大致分为两种方法。其一是通过运维同学的经验实施,另一种方法是基于智能调度系统——基于端、边、云数据协同做智能调度体验优化,这种方法利用了统一视频数据湖技术,实现端、边、云的QoS、QoE、QoC数据的协同,通过智能分析引擎生成流、客户、网络链路、节点、观众的实时画像,基于实时画像+调度策略由智能调度系统实施智能调度,在成本可控的情况下做到最佳体验。衡量指标主要选取两类指标,一类指标是成本指标,比如通过回源率来衡量成本是否下降;另一类指标为体验指标,通过卡顿率、秒开率等判断用户体验是否有提升。以上是视频直播在质量监控和体验提升的一些实践案例。

    音视频服务体验优化实践1——RTC体验优化

    接下来分享实时音视频RTC的体验优化的实践案例。RTC属于第二代音视频业务,它和第一代直播在业务方面有很多差异,比较关注时延以及行为级的监控,基于这些差异性,我们也采用了三个不同优化体系。

    第一点是质量监控,RTC质量监控体系建立了覆盖通话、网络、成本、设备等六个维度的立体质量监控体系,覆盖QoE、QoS、QoC三十多个指标。其中核心指标包括等码率、帧率、丢包率、抖动质量QoS指标和秒开率、时延、卡顿率、入房和选看成功率等用户体验QoE指标,以及带宽等成本QoC指标,与直播监控指标相比,特别是端到端的时延指标,这是基于前面提到的差异性着重关注的。

    基于监控体系,第二个工作是问题诊断,我们首先建立了三类体验质量数据服务,第一类是监控指标数据服务,主要覆盖的是服务端、客户端、设备、QoE、QoS、QoC,这些数据放在统计库、时序库中使用。第二类是网络端所有控制面和媒体面的事件数据服务。第三类是终端事件数据服务,包括终端侧用户行为事件,例如加入房间、切换角色、操作麦克风或摄像头等事件,此外还包含了终端设备数据,例如CPU、内存、摄像头等。

    基于这三类体验质量数据服务,RTC构建了三层问题诊断体系。

    第一层构建是覆盖全链路、全维度的QoE/QoS实时监控体系,可以在分钟级完成体验诊断和快速恢复问题。

    第二层监控体系是基于网络行为数据和端侧行为数据的一键式用户个例通话QoS调查能力,它可以帮助我们快速解决RTC业务单用户的体验问题和投诉。

    第三层问题诊断能力是在第一层QoE/QoS全局指标监控和第二层QoS行为调查能力基础上的体验问题自动诊断高级能力,它通过监控三十多个指标产生二十多个异常事件,并通过学习模型,给出影响的六类体验场景。这样系统就可以快速自动化地判断出体验发生异常的原因,并且快速传递给客户。

    如何构建音视频服务全流程质量监控平台?

    上述介绍的是华为云RTC业务体验优化的实践案例,做体验质量优化工作是需要平台完成的,我们下面来分享华为是如何构建音视频服务全流程质量监控平台的。首先从数据采集、传输、计算到消费四个环节的亿级规模音视频质量监控大数据平台,包括支持端、边、云全数据采集和传输的数据网络,支持实时计算、离线计算和机器学习的多模数据处理系统,以及支持运维、运营、客户的数据消费服务体系。

    在构建平台时,会遇到很多性能、质量、效率以及实时性的问题,如何构建一个大容量、低成本、高效率和可信数据质量的平台?我们采用了批流一体和存算分离的架构。批流一体解决的是开发效率的问题,我们同一个指标可能在批流一体中计算一次就可以对所有服务使用,不需要重复开发,同时我们有一站式数据开发平台可以解决开发效率的提升。成本问题上我们采用的是存算分离——存储和计算是分离的,存储采用的是对象存储,价格相对低廉,计算引擎采用的是前面介绍的批流一体的方式,这样可以做到成本最佳。质量方面是采用了“ODS-DWD-DWS-ADS”四层数据治理平台,保证所有数据可跟踪、可管理,确保任何指标数据都是实时、完整、准确的。

    在有了大容量、低成本的平台后,我们还面临断网、设备故障等问题。我们在平台可用性上基于云服务实施,采用跨Region主备容灾和多AZ模式,整体SLA可达99.99%,来自端、边缘、云等全部六类数据不丢失,监控、调度等六类服务不降级。这样我们在整个环境下,任何环节出现异常,在质量和服务提升上都可以正常工作。

    如何持续保证音视频体验质量三大利器?

    回顾本次分享,音视频体验发展有三个特点:第一,用户对体验的要求是真实感越来越强,直播、RTC等用户要求更高;第二,在用户体验上要求越来越互动;第三,面对各种网络、终端业务环境越来越复杂。

    为了保证音视频体验质量,我们有3个利器:第一,针对不同业务场景,构建“先监控再诊断后提升”的体验质量体系;第二,基于“数据湖+数据服务”解决用户差异性和市场不确定性的问题;第三,在实施过程中要平衡成本和体验的关系。

    对未来音视频业务体验我们有三点规划方向:一是持续基于端、边、云数据协同来驱动QoE、QoS、QoC优化;二是构建音视频内容质量的智能评估体系;三是建立第三代XR音视频体验质量规范,如沉浸感等。

    本文分享自华为云社区《云原生时代,解密华为云音视频质量监控与优化实践》,原文作者:音视频大管家。

     

    点击关注,第一时间了解华为云新鲜技术~

    展开全文
  • 质量屋为研究对象,基于产品广义质量将用户需求划分为产品质量需求、时间需求、成本需求、环境需求、售后服务需求5类,建立用户需求结构;应用层次分析法确定用户需求重要度;基于产品设计质量,将设计需求展开为...
  • 为应对移动互联网下视频通信的变化,本文对不同终端的屏幕及不同网络环境下视频通信的最佳分辨率格式进行了研究,并提出了一种屏幕适配的视频协商...以期利用现有条件,通过技术方案的优化提升视频通信的用户体验。
  • App网络服务的高可靠和低延迟对于无线业务稳定发展至关重要,过去两年来我们一直在持续优化App网络服务的性能,到今年Q2结束时基本完成了App网络服务通道治理和性能优化的阶段性目标,特此撰文总结其中的经验教训,...

    App网络服务的高可靠和低延迟对于无线业务稳定发展至关重要,过去两年来我们一直在持续优化App网络服务的性能,到今年Q2结束时基本完成了App网络服务通道治理和性能优化的阶段性目标,特此撰文总结其中的经验教训,为以后的工作打下基础。

    携程App无线网络服务架构


    2014年携程为无线服务开发了MobileGateway,有两种类型:TCP GatewayHTTP Gateway TCP Gateway设计用于AppNative业务网络服务,基于TCP协议之上设计了应用层协议,类似于RPC机制。TCP Gateway兼具了接入层和服务动态路由的功能,接入层的功能基于Netty实现,管理客户端的TCP长连接或者短连接;动态路由的功能基于Netfix开源的Zuul实现(Zuulis a gateway service that provides dynamic routing, monitoring, resiliency,security, and more.),可以在TCP Gateway上实现服务路由、监控、反爬和用户鉴权等功能。


    TCP Gateway

    每个TCP服务请求到达TCPGateway之后,会根据报文头中的服务号,转发到后端对应的业务服务集群上,从而实现后端服务的解耦。TCPGateway到后端业务服务集群之间的转发使用HTTP协议的接口形式实现,一个TCP服务请求的完整报文会作为HTTP请求的Payload转发到后端业务服务集群,接收到HTTP响应后,会将其Payload完整的返回到对应的TCP连接中。

    HTTPGateway用于AppHybridH5 Web站点的网络服务,采用HTTP Restful接口形式提供服务,其逻辑相对简单,核心是HTTP服务动态转发的功能。


    HTTP Gateway

    MobileGateway的更多设计实现细节可以参考王兴朝同学在2015上海QCon的演讲《携程无线Gateway

    基于TCP协议实现App网络服务


    带宽和延迟是影响网络服务性能的两个因素,带宽受网络通道上最小带宽的网段限制,延迟是网络包在客户端和服务端之间的来回传输时长,不同网络类型上的带宽和延迟差别非常大(见下图)。


    带宽和延迟

    我们要实现更好性能的网络服务,对于网络自身的带宽和延迟这两点而言,能做只是尽可能选择最合适的网络通道,其他只能在如何使用网络通道上进行优化。

    传统的非IM即时消息类App通常都是使用HTTP协议来实现网络服务的(RestfulAPI形式),携程使用TCP协议来实现,确实会增加很多开发成本,例如需要设计应用层协议、管理网络连接、处理异常等,但下面几点原因还是让我们最终选择基于TCP协议来实现App网络服务:

    1.携程用户有时会在网络环境非常差的景区使用,需要针对弱网进行特别的优化,单纯HTTP应用层协议很难实现。

    2.HTTP请求首次需要进行DNS域名解析,我们发现国内环境下针对携程域名的失败率在2-3%(包含域名劫持和解析失败的情况),严重影响用户体验。

    3.HTTP虽然是基于TCP协议实现的应用层协议,优势是封装性好,客户端和服务端解决方案成熟。劣势是可控性小,无法针对网络连接、发送请求和接收响应做定制性的优化,即使是HTTP的特性如保持长连接KeepAlive或者管道Pipeline等都会受制于网络环境中的Proxy或者服务端实现,很难充分发挥作用。

    基于TCP协议实现可以让我们能够完整控制整个网络服务生命周期的各个阶段,包括如下几个阶段:

    1.获取服务端IP地址

    2.建立连接

    3.序列化网络请求报文

    4.发送网络请求

    5.接受网络响应

    6.反序列化网络响应报文

    我们的网络服务通道治理和优化工作就是从这几个方面展开的。

    TCP网络服务通道治理和性能优化


    1. 告别DNS,直接使用IP地址

    如果是首次发送基于HTTP协议的网路服务,第一件事就是进行DNS域名解析,我们统计过DNS解析成功率只有98%,剩下2%是解析失败或者运营商DNS劫持(LocalDNS返回了非源站IP地址),同时DNS解析在3G下耗时200毫秒左右,4G也有100毫秒左右,延迟明显。我们基于TCP连接,直接跳过了DNS解析阶段,使用内置IP列表的方式进行网络连接。

    携程App内置了一组ServerIP列表,同时每个IP具备权重。每次建立新连接,会选择权重最高的IP地址进行连接。App启动时,IP列表的所有权重是相同的,此时会启动一组Ping的操作,根据Ping值的延迟时间来计算IP的权重,这么做的原理是Ping值越小的IP地址,连接后的网络传输延迟也应该相对更小。业界也有使用HTTPDNS方式来解决DNS劫持问题,同时返回最合适用户网络的ServerIP。然而HTTPDNS的开发和部署需要不小的开发成本,我们目前没有使用。

    内置ServerIP列表也会被更新,每次App启动后会有个MobileConfig服务(支持TCPHTTP两种网络类型服务)更新Server IP列表,同时支持不同产品线的Server IP列表更新。因此,传统DNS解析能够解决多IDC导流的功能也可以通过此方法解决。

    2. Socket连接优化,减少连接时间

    HTTP协议中的Keepalive特性一样,最直接减少网络服务时间的优化手段就是保持长连接。每次TCP三次握手连接需要耗费客户端和服务端各一个RTTRoundtrip time)时间才能完成,就意味着100-300毫秒的延迟;TCP协议自身应对网络拥塞的Slow Start机制也会影响新连接的传输性能。

    携程App使用了长连接池的方式来使用长连接,长连接池中维护了多个保持和服务端的TCP连接,每次网络服务发起后会从长连接池中获取一个空闲长连接,完成网络服务后再将该TCP连接放回长连接池。我们没有在单个TCP连接上实现PipelineMultiplexing机制,而是采用最简单的FIFO机制,原因有二:1.简化MobileGateway的服务处理逻辑,减少开发成本;2.在服务端同时返回多个响应时,如果某个响应报文非常大,使用多个长连接方式可以加快接收服务响应报文速度。

    如果发起网络服务时长连接池中的TCP连接都正在被占用,或者TCP长连接的网络服务失败,则会发起一个TCP短连接实现网络服务。这里长连接和短连接的区别仅仅是服务完成后是否直接关闭这个TCP连接。

    附:PipelineMultiplexing是有区别的,如HTTP/1.1支持Pipeline,客户端能否同时发送多个请求,但是服务端返回响应时也要按照请求的发送次序来返回响应;SPDYHTTP/2协议支持Multiplexing,即支持响应报文的乱序返回,发送请求和接收响应互不干扰,因此避免了HTTP/1.1Pipeline也没能完全解决的Head of line blocking问题。参考资料:1,2。参考资历2中提到HTTP/1.1Pipeline特性只是部分解决了Head of line blocking问题,因为a large orslow response can still block others behind it

    3. 弱网和网络抖动优化

    携程App引入了网络质量参数,通过网络类型和端到端Ping值进行计算,根据不同的网络质量改变网络服务策略:

    调整长连接池个数:例如在2G/2.5GEgde网络下,会减少长连接池个数为1(运营商会限制单个目标IPTCP连接个数);WIFI网络下可以增加长连接池个数等机制。

    动态调整TCPconnectionwriteread的超时时间。

    网络类型切换时,例如WIFI和移动网络、4G/3G切换至2G时,客户端IP地址会发生变化,已经连接上的TCPSocket注定已经失效(每个Socket对应一个四元组:源IP、源Port、目标IP、目标Port),此时会自动关闭所有空闲长连接,现有网络服务也会根据状态自动重试。

    4. 数据格式优化,减少数据传输量和序列化时间

    传输数据量越小,在相同TCP连接上的传输时间越短。携程App曾经使用自行设计的一套数据格式,后来和GoogleProtocolBuffer对比后发现,特定数据类型下数据包大小会降低20-30%,序列化和反序列化时间可以降低10-20%,因此目前核心服务都在逐步迁移到到ProtocolBuffer格式。另外Facebook曾分享过他们使用FlatBuffer数据格式提高性能的实践,我们分析后不太适合携程的业务场景因而没有使用。

    5. 引入重试机制,提升网络服务成功率

    TCP协议重传机制来保证可靠传输的机制启发,我们在应用层面也引入了重试机制来提高网络服务成功率。我们发现90%以上的的网络服务失败都是由于网络连接失败,此时再次重试是有机会连接成功并完成服务的;同时我们发现前面提到的网络服务生命周期处于1建立连接、序列化网络请求报文、发送网络请求这三个阶段失败时,都是可以自动重试的,因为我们可以确信请求还没有达到服务端进行处理,不会产生幂等性问题(如果存在幂等性问题,会出现重复订单等情况)。当网络服务需要重试时,会使用短连接进行补偿,而不再使用长连接。

    实现了上述机制后,携程App网络服务成功率由原先的95.3%+提升为如今的99.5%+(这里的服务成功率是指端到端服务成功率,即客户端采集的服务成功数除以请求总量计算的,并且不区分当前网络状况),效果显著。

    6. 其他网络服务机制 & Tricks

    携程App也实现了其他一些网络服务机制方便业务开发,如网络服务优先级机制,高优先级服务优先使用长连接,低优先级服务默认使用短连接;网络服务依赖机制,根据依赖关系自动发起或取消网络服务,例如主服务失败时,子服务自动取消。

    开发过程中我们也发现一些移动平台上的TCPSocket开发tricks

    1.iOS平台上的原生Socket接口创建连接并不会激活移动网络,这里原生Socket接口是指POSIXSocket接口,必须使用CFSocket或者再上层的网络接口尝试网络连接时才会激活网络。因此携程App启动时会优先激活注册一些第三方SDK以及发送HTTP请求来激活移动网络。

    2.合理设置Socket的几个参数:SO_KEEPALIVE参数确保TCP连接保持(注:此KeepAliveTCP中的属性,和HTTPKeepAlive是两个场景概念),SO_NOSIGPIPE参数关闭SIGPIPE事件,TCP_NODELAY参数关闭TCPNagle算法的影响。

    3.由于iOS要求支持IPv6-Only网络,因此使用原生Socket必须支持IPv6

    4.如果使用select来处理nonblockingIO操作,确保正确处理不同的返回值和超时参数。

    5.保持TCP长连接可用性的心跳机制:对于非IM类应用而言,心跳机制的作用不大,因为用户会不断触发请求去使用TCP连接,尤其在携程业务场景下,通过数据统计发现使用心跳与否对服务耗时和成功率影响极小,因此目前已经关闭心跳机制。原先的心跳机制是TCP长连接池中的空闲TCP连接每60秒发送一个心跳包到GatewayGateway返回一个心跳响应包,从而让双方确认TCP连接有效。

    Hybrid网络服务优化


    携程App中有相当比例的业务是使用Hybrid技术实现的,运行在WebView环境中,其中的所有网络服务(HTTP请求)都是由系统控制的,我们无法掌控,也就无法进行优化,其端到端服务成功率也仅有97%左右(注:这里指页面中业务逻辑发送的网络服务请求,而非静态资源请求)。

    我们采用了名为『TCPTunnel for Hybrid』的技术方案来优化Hybrid网络服务,和传统HTTP加速产品的方法不同,我们没有采用拦截HTTP请求再转发的方式,而是在携程Hybrid框架中的网络服务层进行自动切换。


    TCP Tunnel for Hybrid

    如图所示,该技术方案的流程如下:

    1.如果App支持TCPTunnel for HybridHybrid业务在发网络服务时,会通过Hybrid接口转发至App Native层的TCP网络通讯层,该模块会封装这个HTTP请求,作为TCP网络服务的Payload转发到TCP Gateway

    2.TCP Gateway会根据服务号判断出是Hybrid转发服务,解包后将Payload直接转发至HTTP Gateway,此HTTP请求对HTTP Gateway是透明的,HTTP Gateway无需区分是App直接发来的还是TCP Gateway转发来的HTTP请求;

    3.后端业务服务处理完成后,HTTP响应会经HTTPGateway返回给TCP GatewayTCP Gateway将此HTTP响应作为Payload返回给AppTCP网络通讯层;

    4.TCP网络通讯层会再将该Payload反序列化后返回给Hybrid框架,最终异步回调给Hybrid业务调用方。整个过程对于Hybrid业务调用方也是透明的,它并不知道TCPTunnel的存在。

    采用该技术方案后,携程AppHybrid业务的网络服务成功率提升至99%以上,平均耗时下降了30%


    TCP Tunnel for Hybrid Result

    海外网络服务优化


    携程目前没有部署海外IDC,海外用户在使用App时需要访问位于国内的IDC,服务平均耗时明显高于国内用户。我们采用了名为『TCPBypass for Oversea』的技术方案来优化海外网络服务性能,主要是使用了Akamai的海外专属网络通道,同时在携程国内IDC部署了局端设备,使用专用加速通道的方式来提升海外用户体验。


    TCP Bypass for Oversea

    海外用户启动App后先通过Akamai定制域名获取ServerIP,所有网络服务优先走Akamai通道;如果Akamai通道的网络服务失败并且重试机制生效时,会改走传统Internet通道进行重试。相比只用传统Internet通道,在保持网络服务成功率不变的情况下,使用Akamai通道Bypass技术后平均服务耗时下降了33%


    TCP Bypass for Oversea Result

    其他网络协议探讨


    过去两年我们的网络服务优化工作都是基于TCP协议实现的,基本达到了优化目标。不过这两年来新的应用层网络协议SPDYHTTP/2逐步迈入主流,基于UDPQUIC协议看起来也非常有趣,值得跟进调研。

    SPDY & HTTP/2

    SPDYGoogle基于TCP开发的网络应用层协议,目前已经停止开发,转向支持基于SPDY成果设计的HTTP/2协议,HTTP/2协议的核心改进其实就是针对HTTP/1.x中影响延迟性能的痛点进行优化:

    1.Header压缩:压缩冗余的HTTP请求和响应Header

    2.支持Multiplexing:支持一个TCP连接上同时实现多个请求和响应。

    3.保持长连接(比HTTP/1.x更彻底):减少网络连接时间。

    4.支持推送:可以由服务端主动推送数据到客户端。

    官方性能测试结果显示使用SPDY或者HTTP/2的页面加载时间减少30%左右,不过这是针对网页的测试结果,对于App中的网络服务,具体优化效果我们还在进行内部测试,不过其优化手段看和目前我们使用TCP协议的优化手段类似,因此性能优化效果可能不会很显著。

    QUIC

    QUICGoogle基于UDP开发的应用层协议,UDP协议无需连接,不存在重传机制,因此应用层需要保证服务的可靠性。目前国内腾讯有针对弱网络尝试过QUIC协议,我们也在进行测试,最终是否会采用还需要看测试的结果。

    综述


    技术只是手段,最终还是要反映在业务效果上。我们已经实现除静态资源等需要访问CDN的网络请求外,其他App网络服务使用统一的TCP通道,从而具备更好的性能调优和业务监控能力。携程目前基于TCP协议的各种App网络服务优化,也是各种技术方案的平衡,虽然目前HTTP/2等新协议逐步成熟,但是TCP协议自身的灵活性支持有针对性的性能优化,还是具备其特别的优势,希望我们的实践总结能对国内无线技术从业者有一些借鉴价值。

     

    展开全文
  • 图片优化——质量与性能的博弈

    千次阅读 2019-01-09 14:25:36
    图片优化——质量与性能的博弈 《高性能网站建设指南》的作者 Steve Souders 曾在 2013 年的一篇 博客 中提到: 我的大部分性能优化工作都集中在 JavaScript 和 CSS 上,从早期的 Move Scripts to the Bottom 和 ...
  • 原文:Optimizing web servers for high throughput and low latency ...服务器出厂时,BIOS 默认达到了性能和能耗之间的良好平衡,以适应一般环境,然而在不同的环境下可能需要对服务器进行优化,以获得最大的...
  • 微博短视频服务优化实践

    千次阅读 2018-06-27 07:37:20
    本文来自新浪微博视频转码平台技术负责人李成亚在LiveVideoStackCon 2017上的分享,由LiveVideoStack整理成文。李成亚分享了微博短视频如何提升...
  • 五、Win7系统服务优化攻略  前文提到Windows系统启动的原理,其中加载各项系统服务是影响系统启动时间的重要因素,之前软媒在Win7之家(www.win7china.com)和Vista之家(www.vista123.com)上都写过类似的服务...
  • 由于Internet 环境的开放性和动态性, 导致Web 服务质量稳定性较差, 进而严重影响服务组合的准确度. 为此, 提出一种基于QoS 随机性和信任评价的全局动态服务组合方法. 首先, 剔除导致客观QoS 不稳定的异常值, 并估计...
  • 移动边缘计算环境下的边缘服务器放置方法研究[D].北京邮电大学,2018. 阅读材料可以去知网搜一下,如果没有办法下载给我留言,我发给你百度云盘链接 这段时间我一直在阅读边缘计算方面的论文,心里一直有这个疑惑...
  • squid 优化指南

    万次阅读 2011-07-01 10:38:00
    只要不是太弱智的配置导致无法缓存,squid的性能不会有太大差距,也就提高10%左右,只有实际的业务针对squid 进行一些调整,squid 才会真正爆发出他的能量,很多时候有 100%-200% 的提升。本文基本是一些方向性的...
  • 与有线网络通信相比,无线网络通信受环境影响比较大(例如高层建筑、用户移动、环境噪音、相对封闭环境等等),网络的服务质量相对来说不是非常稳定,导致用户经常会在弱信号的网络环境下通信。而当用户在这种网络...
  • 为解决云制造环境下虚拟资源调度存在的算法求解效率不高、模型建立缺乏考虑任务间关系约束和任务间及子任务间的物流时间及成本因素等不足,构建了兼顾交货期时间最小化、服务成本最低化、服务质量优化为目标的多...
  • 针对异构云环境中运算节点性能各异、密码服务处理命令和密码算法组合多样且随机髙并发的问题,综合考虑用户请求任务与云中运算节点的多项属性,从任务和节点角度优化整体调度系统的服务质量及任务调度成功率,设计一...
  • 服务名称 ...对使用下一代技术编写的程序的运行提供优化。该服务的默认运行方式是手动,不建议更改。 \\WINDOWS\Microsoft.NET\Framework\v2.0.50215\mscorsvw.exe 估计使用该技术之后,运行.Net技术编写
  • Windows XP 系统服务优化设置详解

    万次阅读 2005-05-17 14:33:00
    Windows XP 系统服务优化设置详解(绝对精华) 分享XP_SP2服务详解及优化 XP_SP2服务详解及优化 个人认为XP的优化只有从服务着手,才是真正的优化,网上流传着一些方法,我 觉得根本就是扯淡,例如:修改二级缓存,...
  • Web前端性能优化——如何提高页面加载速度

    万次阅读 多人点赞 2018-09-04 07:57:15
    在同样的网络环境下,两个同样能满足你的需求的网站,一个“Duang”的一下就加载出来了,一个纠结了半天才出来,你会选择哪个?研究表明:用户最满意的打开网页时间是2-5秒,如果等待超过10秒,99%的用户会关闭这个...
  • 数据库性能优化

    千次阅读 2010-10-31 18:28:00
    数据库性能优化
  • 最全的Windows7 服务优化、详解。

    千次阅读 2013-01-16 14:13:34
     这是我个人根据网上提供的服务优化说明来修改的(【】号里就是我自己设定的),我是以安装了卡巴斯基和金山网镖的前提下关闭一些系统自带的防火墙和安全的服务,家庭电脑使用不错。大家使用看看~基本上优化后系统...
  • 性能优化系列(五)网络性能优化

    千次阅读 2020-03-02 09:45:54
    虽然网络环境在逐渐变好,但也对网络的应用提出了更高的要求,同时开发人员对网络的重视度却在下降。确实 WiFi 场景下用户的网络质量变好了,而且用户对网络流量消耗的敏感度也在下降。 由于对网络问题的忽视,在...
  • Android App优化之网络优化

    千次阅读 2016-11-10 08:49:09
    Android App优化之性能分析工具Android App优化提升你的App启动速度之理论基础Android App优化提升你的App启动速度之实例挑战Android App优化之Layout怎么摆Android App优化之ANR详解Android App优化之消除卡顿...
  • 网络中流传的方法也很多,本站为大家整理了一些加快Windows 7系统的开机速度的方法,在接下去的几天中,将陆续分期发布,本专题包括序章和开机原理、优化设置、字体清理、服务优化、注册表清理、自启动管理、特效与...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,388
精华内容 35,355
关键字:

优化服务环境提升服务质量