流媒体技术世界——分享技术,增值服务
Wowza Stream Engine 4 的性能调优
注意:Wowza Stream Engine 4安装后默认的配置足可以满足开发级性能要求,但远不能满足产品级性能要求!

这篇文章阐述了如何在您的硬件环境下进行性能调优。

目录


概述
安装合适的操作系统
对Wowza Streaming Engine做性能调优
Java settings
Thread pools
Media Cache tuning
Virtual host processors
Virtual host ports
Virtual host threads
使用XML配置文件进行性能调优

概述


从Wowza Streaming Engine™ 4.2.0版本开始,Wowza在安装包中就已经自带了一个版本为1.8.0的JRE,在安装Wowza Streaming Engine时,它会被自动安装,并被默认地调整到开发模式,你可以通过Java Setting的设置将其调整为产品模式(正式运行环境),如果你对Java性能调优很熟悉,你也可以在Wowza Streaming Engine 管理界面中手动调整各种细节参数。

注意: 如果你使用的是Wowza Streaming Engine 4.1.2或更早的版本或者是Wowza Media Server,请尽可能的用最新的Oracle Java Development Kit (JDK),这样会获得最好的运行性能。另外,你最好是使用64位的操作系统和64位Java VM,以使得Java heap 可以超过2 GB。 更多细节,请参考How to manually install and troubleshoot Java with Wowza Streaming Engine.

安装合适的操作系统



首先,无论是Windows系统还是Linux系统,我们建议你尽量使用较新的操作系统版本。
其次,请使用64位操作系统。
最后,这台服务器上除了Wowza Streaming Engine外,尽量不要安装和运行其它无关的程序。

对Wowza Streaming Engine做性能调优


默认情况下,你可以用下面格式的URL,访问Wowza Streaming Engine Manager的管理界面:

http://[wowza-ip-address]:8088/enginemanager

在Wowza Streaming Engine Manager的管理界面中,点击页面顶部的Server菜单,然后在左侧导航菜单选择Performance Tuning,在Performance Tuning显示了服务器的操作系统,可用的内存,处理器的核心数量,以及Java版本和架构。

wowza

Java Settings



在左侧导航菜单点击Java Settings。这个Java Settings界面展现了当前的Java 设置,包括Java Heap Size,这是分配给Wowza Streaming Engine的内存,以及Java Garbage Collection Settings.

Wowza

要改变这些设置,点击EditJava Heap SizeJava Garbage Collection Settings 分别都有三个可选参数。如果是在一个独占的正式运行环境,请为Java Heap Size选择Production level,并为Java Garbage Collection Settings选择Concurrent collector,然后点击SaveJava Heap Size的默认参数是Development level. 你也可以根据需要选择Custom level,然后自己设置一个值。

注意:目前Wowza的管理界面上对Custom level设置了一个不合理的限制,即最大只能是10GB,如果你要设置更大的Java Heap size,请在Wowza安装目录下conf/tune.xml文件中修改。

重启Wowza Streaming Engine ,让这些修改生效。

Server Thread Pools



在左侧导航菜单点击Server Thread PoolsServer Thread Pools界面展现了当前的Handler Thread Pool SizeTransport Thread Pool Size

wowza

要改变这些设置,请点击Edit。如果这些设置保留在Set automatically,那么Wowza Streaming Engine 会自己计算Handler Thread Pool SizeTransport Thread Pool Size ,计算方式如下:

Handler Thread Pool Size = 60 x Processor Cores

Transport Thread Pool Size = 40 x Processor Cores

注意: Processor Cores 的值显示在Performance Tuning界面。

Media Cache Tuning



点击左侧导航菜单的Media Cache TuningMedia Cache Tuning 的设置应用于类型为VOD Edge的应用。 包括Writer Thread PoolReadahead Thread PoolMaximum Pending Write Request Size以及Maximum Pending Readahead Request Size

wowza

要改变这些设置,点击Edit,如果你将其保留为Set automatically, 那么Wowza Streaming Engine 将自己计算Writer Thread PoolReadahead Thread Pool,计算方式如下:

Writer Thread Pool = 2 x Processor Cores

Readahead Thread Pool = 1 x Processor Cores

Maximum Pending Write Request SizeMaximum Pending Readahead Request Size 的计算方式是基于Java Heap Size的设置,如下:

Java Heap Size 1200 MB to 3999 MB 4000 MB to 7999 MB 8000 MB or greater
Maximum Pending Write Request Size 160 MB 500 MB 1000 MB
Maximum Pending Readahead Request Size 80 MB 250 MB 500 MB


Virtual Host Processors



点击左侧导航菜单的Virtual Host Processors。 在Virtual Host Processors界面展现了在VHost层面处理不同类型的链接的线程数量。

wowza

要改变这些设置,请点击Edit。当将其保留在Set automatically时,Wowza Streaming Engine将按照如下规则自己计算这个值:

Net Connections Processor Count = 2 x Processor Cores

Media Caster Processor Count = 2 x Processor Cores

Idle Worker Count = 2 x Processor Cores

Unicast Incoming Processor Count = 2 x Processor Cores

Unicast Outgoing Processor Count = 2 x Processor Cores

Multicast Incoming Processor Count = 2 x Processor Cores

Multicast Outgoing Processor Count = 2 x Processor Cores

Client Idle Frequency是一个单位为毫秒的时长,Adobe Flash 播放器RTMP连接的idle时长(我理解是一个超时时长)。 对于最基本的VOD点播来说,250毫秒可以提供稳定且性能不错的效果。对于低延时的直播业务来说125到250毫秒是合适的。 如果你对低延时不是特别在意(更在意稳定性),Client Idle Frequency可以调整到500,这样可以降低CPU占用率,使得系统可以支撑更多的客户端连接。 它的有效值是1到1000。

RTP Idle Frequency是一个单位为毫秒的时长,是RTP连接的idle时长(我理解是一个超时时长). 它的有效值是1到1000。

Virtual Host Ports



Virtual Host Ports 界面展现了当前Wowza使用的端口,以及分配给每一个端口的处理线程数量。

Wowza

要改变这些设置,请点击Edit。若将设置保留为Set automatically,那么Wowza Streaming Engine 将按如下方式自己计算线程数量:

Port 1935 Processor Count = 2 x Processor Cores

Port 8086 Processor Count = 2 x Processor Cores


Virtual Host Thread Pools



点击左侧导航菜单的Virtual Host Thread Pools 如果你配置并运行了多个VHost,那么你需要设置Virtual Host Thread Pools



如果你配置并运行了多个VHost,那么请将Handler Thread Pool SizeTransport Thread Pool Size 设置为Use Server Settings。 在这种情况下,handler 和 transport 线程在多个VHost上会由Wowza Server平等分配。

对Wowza Media Server进行性能调优



注意: 对配置文件中的任何参数做了修改后,您都需要重启Wowza Media Server,以让它生效。


Java Heap Size



默认状态下,Java heap 的大小在Windows上被设置为768MB,在Linux上被设置为1200MB,这样的设置对于开发环境来说是足够了,但是远不足以应付正式商业运营环境。如果你正在运行64位的Java VM,并且服务器具有4GB或更多的内存,我们建议您可以将Java Heap Size的大小设置为至少80%的物理内存大小。 可以通过以下脚本文件按调整内存设置(请参考各个不同的平台):

  • [install-dir]/bin/setenv.sh (Linux, Mac OS X and Solaris, around line 4)
    Code:
    JAVA_OPTS="-Xmx3000M"
  • [install-dir]/bin/setenv.bat (Windows Standalone 及 Windows Service, around line 4)
    Code:
    set JAVA_OPTS=-Xmx3000M


Garbage Collection



Java的垃圾回收(GC)调节是非常复杂的。在一台服务器上运行良好,并不见得在另一台服务器也同样运行良好。
经过试验-报错和客户反馈,我们有一下几点建议:

垃圾回收的参数设置:

我们强烈建议不要做任何多余的设置。大多数流媒体应用场景,默认的-server参数(请参与上面的第2点) 会让系统良好的运行,因此,在大多数场景下不需要为GC做附加的设置就可以让系统良好运行。

仅仅在当你确实遇到关于Java堆(Heap)的问题时,例如内存占用过高,你可以尝试使用以下垃圾回收选项中的一个:

  1. 同步垃圾回收: 同步垃圾回收被设计为希望让垃圾回收引起的中断时间尽可能的少,让正在运行中的应用可以和垃圾回收器共享CPU资源。 建议的附加设置为:

    如果Java堆(heap)为5000 MB或更高 , NewSize=512m
    如果Java堆(heap)为3000 MB 至 5000 MB, NewSize=256m
    如果Java堆(heap)小于3000 MB, NewSize=128m

    例如,64位操作系统, 8 GB 内存,Java堆(heap)大小为6000MB
    -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=512m
  2. Garbage-First 垃圾回收(G1): 它是为低中断时间,高吞吐的应用而设计的。这个G1垃圾回收是为多核处理器且大内存的服务端程序设计的。Oracle JDK 7 Update 4及以上版本都完全支持它。要使用这种垃圾回收器,推荐的设置如下:
    -XX:+UseG1GC -XX:MaxGCPauseMillis=100

要改变垃圾回收的设置,修改以下脚本:

  • [install-dir]/bin/setenv.sh (Linux, Mac OS X, 以及 Solaris, 去除第10行的注释屏蔽)。例如:
    JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=512m"
  • [install-dir]/bin/setenv.bat (Windows Standalone 和 Windows Service, 去除第10行的注释屏蔽)。例如:
    set JAVA_OPTS=%JAVA_OPTS% -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=512m
  • [install-dir]/bin/setenv.sh ,在Linux系统上监控GC停止时间,添加:
    -verbose:gc -Xloggc:"/usr/local/WowzaMediaServer/logs/gc_%UNIQUE%.log" -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
  • [install-dir]/bin/setenv.sh ,在OS X系统上监控GC停止时间,添加:
    -verbose:gc -Xloggc:"/Library/WowzaMediaServer/logs/gc_%UNIQUE%.log" -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC
  • [install-dir]/bin/setenv.bat,在Windows系统上监控GC停止时间,添加:
    set JAVA_OPTS=%JAVA_OPTS% -verbose:gc -Xloggc:"c:\gc.log" -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime
    注意: 在Windows系统上,处于Debug的目的,这会生成一个C:\gc.log的文件。这个gc.log文件 file is only created when starting the Wowza media server in service mode or if using the command line.


一些其它的调优措施



  • 对于低延时的聊天应用,最好使用较小的socket缓冲(读和写共16000 bytes)。socket缓冲大小设置在[install-dir]/conf/VHost.xml文件中:
    <ReceiveBufferSize>16000</ReceiveBufferSize>
    <SendBufferSize>16000</SendBufferSize>
  • Linux上, 增大文件描述符的最大值。这样将会处理Too many files open 错误信息。如果要这么做,编辑以下两个文件:

    /usr/local/WowzaMediaServer/bin/wms.sh

    从:
    #ulimit -n 20000
    改为:
    ulimit -n 20000
    /usr/local/WowzaMediaServer/bin/startup.sh

    从:
    #ulimit -n 20000
    改为:
    ulimit -n 20000
    注意:
    • 在某些版本的linux上,如果你没有权限修改文件描述符的限制,就会导致失败。如果使用这个修改后,Wowza Media Server没有正常启动,请查找文档或咨询你的系统工程师,来看看如何增大文件描述符的限制。
    • 在某些版本的Linux上,在内核上也有这个限制,也需要增大。请查找对应发行版本的文档。你可能会需要在/etc/sysctl.conf文件中增加以下几行:
      fs.file-max=20000
  • Linux上, 将I/O调度算法(elevator algorithm)调整到Anticipatory elevator (as) 。请参阅下面关于它的描述:

    为Red Hat选择一种I/O调度算法

  • Linux上, 挂载(mount)磁盘时采用noatime选项。这个操作在不同的Linux发行版上会有一些不同。 下面是一个关于这个设置的基本描述:

    使用noatime属性

  • 根据可用的CPU资源来调整服务器配置,如下:

    [total-core-count]指服务器上CPU的总核数。例如,假设你有2颗4核的CPU, 那么[total-core-count] 为:
    2 (processor) x 4 (cores) = 8
    假如你的服务器支持超线程(hyper-threading), 请使用总线程数。依据上面的例子, 如果可以使用超线程(hyper-threading), 总线程数为:
    2 (processor) x 4 (cores) x 2 (threads per core) = 16
    随着每一颗CPU的核数和线程数的持续增加,我们建议为下面每一项设置一个最大线程数:

    在配置文件[install-dir]/conf/VHost.xml中:
    HostPort/ProcessorCount: 2x[total-core-count] (maximum of 24) 
    注意:在Admin HostPort (/Port "8086")中的 HostPort/ProcessorCount 字段在不能修改。
    IdleWorkers/WorkerCount: 2x[total-core-count] (maximum of 24)
    
    NetConnections/ProcessorCount: 2x[total-core-count]  (maximum of 24)
    
    RTP/UnicastIncoming/ProcessorCount: [total-core-count]  (maximum of 12)
    RTP/UnicastOutgoing/ProcessorCount: 2x[total-core-count]  (maximum of 24)
    
    RTP/MulticastIncoming/ProcessorCount: [total-core-count]  (maximum of 12)
    RTP/MulticastOutgoing/ProcessorCount: [total-core-count]  (maximum of 12)
    
    HandlerThreadPool/PoolSize: (60x[total-core-count]) (maximum of 480)
    TransportThreadPool/PoolSize: (40x[total-core-count]) (maximum of 320)
    
                
    以上是假定平均每一核CPU拥有至少1GB内存,并且你正在使用4核或更多总核数,并且在使用64位Java VM ,并使用上面建议的内存设置.

  • 运行多个Virtual Hosts:

    如果你运行多个virtual host,那么资源必须在每一个VHost之间进行分配。最简单的方法是将上面的设置(它是为一个VHost进行的设置)进行分割,将资源分配到每一个VHost上。这个设置不需要非常平均的分割,然而, 它的总数必须等于一个VHost场景时的配置。如果其中一个VHost在大部分时间比较闲,你分配的内存可以比一个整体的Vhost场景下总内存更高一些。在配置它时,请格外注意,因为过渡的分配是非常危险的。 当为多个Vhost分配资源超过一个Vhost场景下分配的资源或服务器总体可用资源时,一个OutOfMemory错误将发生。

    还有一个方法,在[install-dir]/conf/VHost.xml文件中,你可以将每一个VHost/HandlerThreadPool/PoolSize的值设置为"0" ,并将每一个VHost/TransportThreadPool/PoolSize的值设置为"0" ,它将使得Wowza Media Server使用[install-dir]/conf/Server.xml文件中的这些属性的设置参数。Wowza Media Server将Server层面管理所有VHost的PoolSize的大小。

    也可以采取混合的方法,在[install-dir]/conf/VHost.xml文件中为比较空闲/最少使用的VHost设置PoolSize为"0",同时为比较繁忙/高性能而需要更多资源的VHost设置更高的数值。

  • 在非低延时流媒体场景下,并且你在客户端设置了3秒或更多的缓冲(NetStream.bufferTime), 你可以通过修改[install-dir]/conf/VHost.xml文件中以下两个数值来降低服务器上CPU的负担,以处理更多并发连接(sessions):

    IdleWorkers/CheckFrequency: 100
    Client/IdleFrequency: 500
                
  • 如果你在Linux上遇到多路组播流输入时互相妨碍的问题时,你可能需要将Java属性java.net.preferIPv4Stack 设置为 true。如果要这么做, 请编辑[install-dir]/bin/setenv.sh文件,在清除第13行的注释屏蔽:

    JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
  • 当你在向Adobe Flash 播放传送流媒体时,很重要的第一点是要尽可能的避免使用RTMPT (tunneling version of RTMP)。 RTMPT使用了轮询机制,它非常占用CPU资源。我们建议使用一个协议轮转策略,只在需要使用RTMPT时使用RTMPT。

  • Windows 7, Server 2003 or 2008上, 最好关闭掉TCP auto tuning。这里有关于如何操作的信息:

    How to disable Windows Vista TCP/IP auto-tuning


匿名用户
评论

我们的地址


北京市朝阳区管庄西里建基商务楼423室


邮编:100024

关于我们


北京联方信科信息技术有限责任公司


官网:www.ttstream.com

联系我们


王经理:phone


柳经理:phone

京ICP备14033868号-2