Wowza Stream Engine 4 的性能调优
转载请注明:文章来自www.wowza.cn
注意: 要访问最新的技术资料,请访问http://www.ttstream.com/wowza/
注意:Wowza Stream Engine 4安装后默认的配置足可以满足开发级性能要求,但远不能满足产品级性能要求!

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

注意: 这里的性能调优措施适用于Wowza Media Server® 2 以及往后的版本。 www.wowza.cn

目录


概述
使用Wowza Streaming Engine Manager进行性能调优
Java settings
Thread pools
Media Cache tuning
Virtual host processors
Virtual host ports
Virtual host threads
使用XML配置文件进行性能调优

概述


你最好使用最新Oracle Java Development Kit (JDK)版本,这样你的Wowza Streaming Engine 软件将可以获得最佳的运行效果,你可以从这里下载(Java SE Downloads)。 同时,你最好选择64位操作系统和64位的Java VM,这样可以让你的Java heap 大小超过2 GB。www.wowza.cn

注意:
  • 对于Windows 操作系统,请检查你的JAVA_HOME环境变量指向了最新的Java安装目录。
  • 如果使用的是Mac OS X 10.5.x (Snow Leopard) 及以上版本和64位的硬件,你可以使用Java 6 VM。 要调整OS X上的Java VM版本To change your default Java VM in OS X, open the Java preferences application (/Applications/Utilities/Java/Java Preferences) and drag the Java SE 6 item to the top of the Java Applications list.
By default, Wowza Streaming Engine automatically tunes the server to a development state with the hardware available. The server can then be tuned to a production level by adjusting the Java settings. Knowing that the server is running to the best of its ability makes Wowza Streaming Engine easy to deploy in a production environment. Advanced users can alter the tuning further by using Wowza Streaming Engine Manager, if required.

Tuning the server in Wowza Streaming Engine Manager


注意:
  • Wowza Streaming Engine™ 4.0 or later is required.
  • Streaming Engine Manager requires authentication, which is the user name and password specified in the [install-dir]/conf/admin.password file.
By default, Wowza Streaming Engine Manager can be accessed by using the following URL:

  1. 你最好使用最新的Java JDK 版本(下载 Java SE)。也最好使用64位操作系统和64位的Java VM。64位的VM使得Java堆(heap)超过2GB。

    注意: 如果您在使用64位的Mac OS X 10.5.x 或更高版本(Snow Leopard),你可以使用Java 6 VM。如果要改变OSX中默认的Java VM,您需要打开Java preferences application /Applications/Utilities/Java/Java PreferencesJava SE 6 项目拖拽到Java Applications列表的顶部。

  2. 您最好使用-server 模式运行Java VM。 -server 选项在LinuxMac OS X中是默认的设置。它只在Windows上不是默认设置。要在Windows上开启Java VM 的-server模式,请按如下方式进行:

    1. 安装最新版本的Oracle Java JDK,确认JAVA_HOME 环境变量指向这个版本的Java安装路径。

    2. 编辑Wowza Stream Engine 4的[install-dir]/bin/setenv.bat文件,将-server选项添加到启动脚本中。如下:
      Code:
      set JAVA_OPTS=%JAVA_OPTS% -server
      注意: 要在Windows standalone模式和Windows Service模式下都生效,请去除line 7的注释.

  3. 默认状态下,Java heap 的大小在Windows上被设置为768MB,在Linux上被设置为1200MB,这样的设置对于开发环境来说是足够了,但是远不足以应付正式商业运营环境。如果你正在运行64位的Java VM,并且服务器具有4GB或更多的内存,我们建议的Java heap大小为3000 MB 到 5000 MB之间。 如果您有16 GB或更高的内存,我们建议的Java heap大小为8000 MB。我们不建议Java heap的大小超过10 GB,因为这样会导致Long GC 循环(cycles)/中断(pauses)。如果你的服务器在运行32位Java VM或具有少于3GB的内存, 我们建议的Java heap大小为1500MB。当使用32位VM时,不要尝试将heap大小设置超过1800MB。在很多Linux平台,在服务器正常启动后,经过很小的一段时间,系统会遇到OutOfMemory错误。 www.wowza.cn 可以通过以下脚本文件按调整内存设置(请参考各个不同的平台):

    • [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 and Windows Service, around line 4)
      Code:
      set JAVA_OPTS=-Xmx3000M

  4. 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
      Code:
      -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=512m
    2. 试验性: Garbage-First 垃圾回收(G1): 在 Sun Java 6 (Update 14 或更高版本) 中, 有一个新的垃圾回收器,它还处于试验阶段。www.wowza.cn 它是为低中断时间,高吞吐的应用而设计的(例如Wowza Media Server)。下面有更多信息。要使用这种垃圾回收器,附加的设置如下:
      Code:
      -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

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

    • [install-dir]/bin/setenv.sh (Linux, Mac OS X, 以及 Solaris, 去除第10行的注释屏蔽)。例如:
      Code:
      JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=512m"
    • [install-dir]/bin/setenv.bat (Windows Standalone and Windows Service, 去除第10行的注释屏蔽)。例如:
      Code:
      set JAVA_OPTS=%JAVA_OPTS% -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:NewSize=512m

    下面是一些更细节的信息:

    Java SE 6 HotSpot[tm] 虚拟机垃圾回收调节
    Java SE 6 性能白皮书
    Garbage-First 垃圾回收器(G1)

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

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

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

    从:
    Code:
    #ulimit -n 20000
    改为:
    Code:
    ulimit -n 20000
    注意:在某些版本的linux上,如果你没有权限修改文件描述符的限制,就会导致失败。如果使用这个修改后,Wowza Media Server没有正常启动,请查找文档或咨询你的系统工程师,来看看如何增大文件描述符的限制。

    注意:在某些版本的Linux上,在内核上也有这个限制,也需要增大。请查找对应发行版本的文档。 www.wowza.cn 你可能会需要在/etc/sysctl.conf文件中增加以下几行:
    Code:
    fs.file-max=20000
  7. Linux上, 将I/O调度算法(elevator algorithm)调整到Anticipatory elevator (as) 。请参阅下面关于它的描述:

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

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

    使用noatime属性

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

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

    在配置文件[install-dir]/conf/VHost.xml中:
    Code:
    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 ,并使用上面建议的内存设置. www.wowza.cn

  10. 运行多个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设置更高的数值。

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

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

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

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

    How to disable Windows Vista TCP/IP auto-tuning