Netty-Socketio Windowsのパフォーマンステスト

23433 ワード

Netty-Socketio Windowsのパフォーマンステスト


マシン構成のテスト


サーバ:

  • オペレーティングシステム:Windows Server 2008 R 2 Enterprise
  • CPU:Intel i3-3220
  • メモリ:8 GB
  • JDK: 1.7.0_71-b14 64bit

  • テスター:

  • オペレーティングシステム:Windows Server 2008 R 2 Enterprise
  • CPU:Intel G2030
  • メモリ:6 GB
  • Windows Server 2008 R 2ネットワークチューニング


    作成net.regファイル(インポートレジストリをダブルクリックし、マシンを再起動)は、次のような内容です.
    Windows Registry Editor Version 5.00
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters]
    "ForwardBroadcasts"=dword:00000000
    "IPEnableRouter"=dword:00000000
    "UseDomainNameDevolution"=dword:00000001
    "EnableICMPRedirect"=dword:00000000
    "DeadGWDetectDefault"=dword:00000000
    "DontAddDefaultGatewayDefault"=dword:00000000
    "TcpTimedWaitDelay"=dword:0000001e
    "SynAttackProtect"=dword:00000002
    "TcpMaxPortsExhausted"=dword:00000005
    "TcpMaxHalfOpen"=dword:000001f4
    "TcpMaxHalfOpenRetried"=dword:00000190
    "MaxUserPort"=dword:0000fffe
    "TcpMaxConnectResponseRetransmissions"=dword:00000002
    "TcpMaxDataRetransmissions"=dword:00000002
    "KeepAliveTime"=dword:000493e0
    

    以上の構成では、最大使用可能なポートを調整し、半接続数のセキュリティ設定を開始し、サーバに一定の攻撃防止能力を持たせるため、クライアントが接続をテストする際に同時に数が多すぎると、一部の接続に失敗する可能性があります.

    テストプログラム


    サービスエンドプログラム


    使用例:https://github.com/mrniko/netty-socketio-demo
    以下の変更を行います.
    EventChatLauncher
    public class EventChatLauncher {
    
        private static final Logger log = LoggerFactory.getLogger(EventChatLauncher.class);
    
        public static void main(String[] args) throws InterruptedException {
    
            Configuration config = new Configuration();
            //config.setHostname("localhost");
            config.setPort(9092);
    
            final SocketIOServer server = new SocketIOServer(config);
            server.addEventListener("chatevent", ChatObject.class, new DataListener() {
                @Override
                public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) {
                    //server.getBroadcastOperations().sendEvent("chatevent", data);
                    client.sendEvent("chatevent", data);
                    log.warn(server.getAllClients().size()+":"+data.getUserName()+":"+data.getMessage()); 
                }
            });
    
            server.start();
            Thread.sleep(Integer.MAX_VALUE);
            server.stop();
        }
    
    }

    pom.xml
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
    
        <groupId>com.corundumstudio.socketiogroupId>
        <artifactId>netty-socketioartifactId>
        <version>1.0version>
        <packaging>jarpackaging>
        <inceptionYear>2012inceptionYear>
    
        <properties>
            <main.class>com.corundumstudio.socketio.demo.EventChatLaunchermain.class>
            <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
        properties>
    
        <licenses>
            <license>
                <name>Apache v2name>
                <url>http://www.apache.org/licenses/LICENSE-2.0.htmlurl>
                <distribution>manualdistribution>
            license>
        licenses>
    
        <developers>
            <developer>
                <id>mrnikoid>
                <name>Nikita Koksharovname>
                <roles>
                    <role>Architectrole>
                    <role>Developerrole>
                roles>
                <timezone>+4timezone>
            developer>
        developers>
    
        <dependencies>
            <dependency>
                <groupId>com.corundumstudio.socketiogroupId>
                <artifactId>netty-socketioartifactId>
                <version>1.7.7version>
            dependency>
            <dependency>
                <groupId>org.slf4jgroupId>
                <artifactId>slf4j-log4j12artifactId>
                <version>1.7.7version>
            dependency>       
        dependencies>
    
        <build>
            <plugins>
    
                
                <plugin>
                    <groupId>org.codehaus.mojogroupId>
                    <artifactId>exec-maven-pluginartifactId>
                    <version>1.3.2version>
                    <executions>
                        <execution>
                            <goals>
                                
                                <goal>javagoal>
                            goals>
                        execution>
                    executions>
                    <configuration>
                        <mainClass>${main.class}mainClass>
                    configuration>
                plugin>
    
                <plugin>
                    <artifactId>maven-compiler-pluginartifactId>
                    <version>3.2version>
                    <configuration>
                        <source>1.7source>
                        <target>1.7target>
                        <encoding>UTF-8encoding>
                    configuration>
                plugin>
    
                <plugin>
                    <groupId>org.apache.maven.pluginsgroupId>
                    <artifactId>maven-shade-pluginartifactId>
                    <version>2.4.3version>
                    <executions>
                        <execution>
                            
                            <phase>packagephase>
                            <goals>
                                <goal>shadegoal>
                            goals>
                            <configuration>
                                <transformers>
                                    <transformer
                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                        <mainClass>${main.class}mainClass>
                                    transformer>
                                transformers>
                            configuration>
                        execution>
                    executions>
                plugin>
    
            plugins>
        build>
    
    project>
    

    src/main/resources/log 4 jを増加する.properties
    # DEBUG LOG 
    log4j.rootLogger=WARN,FILE
    
    log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
    log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
    log4j.appender.STDOUT.layout.conversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %-5p\: %m\t(@%t)
    log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.FILE.File=./app.log log4j.appender.FILE.Append= true log4j.appender.FILE.Encoding=utf-8 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH\:mm\:ss} %-5p\: %m\t(@%t)
    # DEBUG LOG log4j.category.com.corundumstudio.socketio.demo=WARN #Disable other log #log4j.logger.org.springframework=OFF #log4j.logger.org.apache.struts2=OFF #log4j.logger.com.opensymphony.xwork2=OFF #log4j.logger.com.mybatis=OFF #log4j.logger.org.hibernate=OFF

    クライアントテスタ


    nodeを使用してテストを行い、今回のテストで使用したnode版は5.12.064ビットnodeインストールパラメータの他のドキュメントです.
    テストスクリプトjs
    var count = 0;
    var max = 2000;
    var sockets = new Array();
    
    for(var i=0;ifunction socketClient(id) {
        var userName = 'user' + id;
        var message = 'message' + id;
        var io = require('socket.io-client');
        var socket = io.connect('http://192.168.1.199:9092',{'force new connection': true});
        socket.on('connect', function() {
            sockets[id]=socket;
            count++;
            console.log('id:'+id+':connect count:'+count);
            //socket.emit('chatevent', {userName: userName, message: message});
        });
    
    }

    テストスクリプトディレクトリの下で、npm install socket.io-client

    テスト実行


    サービス側


    mvn clean packageパッケージによりtarget下で:netty-socketio-1.0を生成する.jar
    起動バッチの作成:start-server.bat
    java -server -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=256m -jar netty-socketio-1.0.jar

    バッチの実行:start-server.bat

    クライアント


    起動バッチの作成:start-client.bat
    node test.js

    バッチの実行:start-client.batは2000個の接続を確立するたびに、接続が確立された後にメッセージを送信し、サーバは同じメッセージに返信する.以上のバッチ・ファイルを繰り返し実行できます.

    初歩的なテスト結果


    接続数が2万程度に達すると、サーバーCPUの占有量が非常に高くなり、90%以上で接続数が6万程度に達すると、サーバーCPUは長期にわたって90%以上を維持しているが、クライアントに接続し続けることができ、6.3程度で接続すると、接続が遅くなり、失敗する現象が発生している.マルチNICとより良いCPUが必要