Forráskód Böngészése

ktor: split to netty and jetty tests, configure mysql (disable ssl) (#2892)

also upgrade kotlin and ktor
Sergey Mashkov 8 éve
szülő
commit
4f5b405f27

+ 24 - 1
frameworks/Kotlin/ktor/benchmark_config.json

@@ -10,7 +10,7 @@
         "update_url": "/updates?queries=",
 
         "port": 9090,
-        "setup_file": "setup",
+        "setup_file": "setup-netty",
         "approach": "Realistic",
         "classification": "Micro",
         "database": "MySQL",
@@ -21,6 +21,29 @@
         "webserver": "None",
         "os": "Linux",
         "database_os": "Linux",
+        "display_name": "ktor netty",
+        "notes": "http://github.com/Kotlin/ktor",
+        "versus": "netty"
+      },
+      "jetty": {
+        "plaintext_url": "/plaintext",
+        "json_url": "/json",
+        "db_url": "/db",
+        "query_url": "/db?queries=",
+        "update_url": "/updates?queries=",
+
+        "port": 9090,
+        "setup_file": "setup-jetty",
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "MySQL",
+        "framework": "ktor",
+        "language": "Kotlin",
+        "orm": "Raw",
+        "platform": "Jetty",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
         "display_name": "ktor jetty",
         "notes": "http://github.com/Kotlin/ktor",
         "versus": "servlet"

+ 53 - 18
frameworks/Kotlin/ktor/pom.xml

@@ -13,11 +13,10 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <kotlin.version>1.1.1</kotlin.version>
+        <kotlin.version>1.1.2-5</kotlin.version>
         <junit.version>4.12</junit.version>
 
-        <ktor.version>0.3.1</ktor.version>
-        <app.main.class>org.jetbrains.ktor.benchmarks.HelloKt</app.main.class>
+        <ktor.version>0.3.3</ktor.version>
     </properties>
 
     <dependencies>
@@ -43,6 +42,11 @@
             <artifactId>ktor-netty</artifactId>
             <version>${ktor.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.jetbrains.ktor</groupId>
+            <artifactId>ktor-jetty</artifactId>
+            <version>${ktor.version}</version>
+        </dependency>
         <dependency>
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
@@ -99,27 +103,58 @@
                 </executions>
             </plugin>
             <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>2.4.3</version>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>default-jar</id>
+                        <phase>none</phase>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <version>3.0.0</version>
+
                 <executions>
                     <execution>
+                        <id>netty</id>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+
                         <phase>package</phase>
+
+                        <configuration>
+                            <descriptors>
+                                <descriptor>src/main/assembly/netty-bundle.xml</descriptor>
+                            </descriptors>
+                            <archive>
+                                <manifest>
+                                    <mainClass>org.jetbrains.ktor.netty.DevelopmentHost</mainClass>
+                                </manifest>
+                            </archive>
+                        </configuration>
+                    </execution>
+                    <execution>
+                        <id>jetty</id>
                         <goals>
-                            <goal>shade</goal>
+                            <goal>single</goal>
                         </goals>
+
+                        <phase>package</phase>
+
                         <configuration>
-                            <minimizeJar>false</minimizeJar>
-                            <createDependencyReducedPom>false</createDependencyReducedPom>
-                            <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
-                                    <manifestEntries>
-                                        <Main-Class>${app.main.class}</Main-Class>
-                                        <X-Compile-Source-JDK>1.8</X-Compile-Source-JDK>
-                                        <X-Compile-Target-JDK>1.8</X-Compile-Target-JDK>
-                                    </manifestEntries>
-                                </transformer>
-                            </transformers>
+                            <descriptors>
+                                <descriptor>src/main/assembly/jetty-bundle.xml</descriptor>
+                            </descriptors>
+                            <archive>
+                                <manifest>
+                                    <mainClass>org.jetbrains.ktor.jetty.DevelopmentHost</mainClass>
+                                </manifest>
+                            </archive>
                         </configuration>
                     </execution>
                 </executions>

+ 2 - 2
frameworks/Kotlin/ktor/setup.sh → frameworks/Kotlin/ktor/setup-jetty.sh

@@ -1,7 +1,7 @@
 #!/bin/bash
 
-fw_depends java mysql
+fw_depends mysql java maven
 
 ./mvnw clean package -DskipTests=true
-nohup java -jar target/tech-empower-framework-benchmark-1.0-SNAPSHOT.jar &
+nohup java -jar target/tech-empower-framework-benchmark-1.0-SNAPSHOT-jetty-bundle.jar &
 

+ 7 - 0
frameworks/Kotlin/ktor/setup-netty.sh

@@ -0,0 +1,7 @@
+#!/bin/bash
+
+fw_depends mysql java maven
+
+./mvnw clean package -DskipTests=true
+nohup java -jar target/tech-empower-framework-benchmark-1.0-SNAPSHOT-netty-bundle.jar &
+

+ 29 - 0
frameworks/Kotlin/ktor/src/main/assembly/jetty-bundle.xml

@@ -0,0 +1,29 @@
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
+    <id>jetty-bundle</id>
+    <formats>
+        <format>jar</format>
+    </formats>
+
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <dependencySets>
+        <dependencySet>
+            <unpack>true</unpack>
+            <scope>runtime</scope>
+
+            <useTransitiveDependencies>true</useTransitiveDependencies>
+
+            <excludes>
+                <exclude>*:ktor-netty</exclude>
+            </excludes>
+        </dependencySet>
+    </dependencySets>
+
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.outputDirectory}</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+    </fileSets>
+</assembly>

+ 28 - 0
frameworks/Kotlin/ktor/src/main/assembly/netty-bundle.xml

@@ -0,0 +1,28 @@
+<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
+    <id>netty-bundle</id>
+
+    <formats>
+        <format>jar</format>
+    </formats>
+
+    <includeBaseDirectory>false</includeBaseDirectory>
+
+    <dependencySets>
+        <dependencySet>
+            <unpack>true</unpack>
+            <scope>runtime</scope>
+
+            <excludes>
+                <exclude>*:ktor-jetty:*</exclude>
+            </excludes>
+        </dependencySet>
+    </dependencySets>
+
+    <fileSets>
+        <fileSet>
+            <directory>${project.build.outputDirectory}</directory>
+            <outputDirectory>/</outputDirectory>
+        </fileSet>
+    </fileSets>
+</assembly>

+ 71 - 73
frameworks/Kotlin/ktor/src/main/kotlin/org/jetbrains/ktor/benchmarks/Hello.kt

@@ -7,13 +7,10 @@ import kotlinx.coroutines.experimental.*
 import org.jetbrains.ktor.application.*
 import org.jetbrains.ktor.content.*
 import org.jetbrains.ktor.features.*
-import org.jetbrains.ktor.host.*
 import org.jetbrains.ktor.http.*
-import org.jetbrains.ktor.netty.*
 import org.jetbrains.ktor.routing.*
 import org.jetbrains.ktor.util.*
-import java.sql.ResultSet.CONCUR_READ_ONLY
-import java.sql.ResultSet.TYPE_FORWARD_ONLY
+import java.sql.ResultSet.*
 import java.util.concurrent.*
 import java.util.concurrent.atomic.*
 import javax.sql.*
@@ -22,13 +19,15 @@ import javax.sql.*
 data class Message(val message: String = "Hello, World!")
 data class World(val id: Int, var randomNumber: Int)
 
-fun main(args: Array<String>) {
+fun Application.main() {
     val (a, b) = hex("62656e63686d61726b6462757365723a62656e63686d61726b646270617373").toString(Charsets.ISO_8859_1).split(":")
     val gson = GsonBuilder().create()
     val DbRows = 10000
-    val dbHost = System.getenv("DBHOST")
     Driver::class.java.newInstance()
-    val pool = hikari(dbHost, a, b)
+    val pool by lazy {
+        val dbHost = System.getenv("DBHOST") ?: error("DBHOST environment variable is not set")
+        hikari(dbHost, a, b)
+    }
 
     val counter = AtomicInteger()
     val databaseExecutor = Executors.newFixedThreadPool(256) { r ->
@@ -36,89 +35,87 @@ fun main(args: Array<String>) {
     }
     val databaseDispatcher = databaseExecutor.asCoroutineDispatcher()
 
-    embeddedServer(Netty, 9090) {
-        install(SamplingCallLogging) {
-            samplingFactor = 50000L
-        }
+    install(SamplingCallLogging) {
+        samplingFactor = 50000L
+    }
 
-        install(DefaultHeaders)
-        routing {
-            get("/plaintext") { call ->
-                call.respond(TextContent("Hello, World!", ContentType.Text.Plain, HttpStatusCode.OK))
-            }
-            get("/json") { call ->
-                call.respond(TextContent(gson.toJson(Message()), ContentType.Application.Json, HttpStatusCode.OK))
-            }
-            get("/db") { call ->
-                val response = run(databaseDispatcher) {
-                    pool.connection.use { connection ->
-                        val random = ThreadLocalRandom.current()
-                        val queries = call.queries()
-                        val result = mutableListOf<World>()
-
-                        connection.prepareStatement("SELECT * FROM World WHERE id = ?", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY).use { statement ->
-                            for (i in 1..(queries ?: 1)) {
-                                statement.setInt(1, random.nextInt(DbRows) + 1)
-
-                                statement.executeQuery().use { rs ->
-                                    while (rs.next()) {
-                                        result += World(rs.getInt("id"), rs.getInt("randomNumber"))
-                                    }
+    install(DefaultHeaders)
+    routing {
+        get("/plaintext") { call ->
+            call.respond(TextContent("Hello, World!", ContentType.Text.Plain, HttpStatusCode.OK))
+        }
+        get("/json") { call ->
+            call.respond(TextContent(gson.toJson(Message()), ContentType.Application.Json, HttpStatusCode.OK))
+        }
+        get("/db") { call ->
+            val response = run(databaseDispatcher) {
+                pool.connection.use { connection ->
+                    val random = ThreadLocalRandom.current()
+                    val queries = call.queries()
+                    val result = mutableListOf<World>()
+
+                    connection.prepareStatement("SELECT * FROM World WHERE id = ?", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY).use { statement ->
+                        for (i in 1..(queries ?: 1)) {
+                            statement.setInt(1, random.nextInt(DbRows) + 1)
+
+                            statement.executeQuery().use { rs ->
+                                while (rs.next()) {
+                                    result += World(rs.getInt("id"), rs.getInt("randomNumber"))
                                 }
                             }
-
-                            TextContent(gson.toJson(when (queries) {
-                                null -> result.single()
-                                else -> result
-                            }), ContentType.Application.Json, HttpStatusCode.OK)
                         }
+
+                        TextContent(gson.toJson(when (queries) {
+                            null -> result.single()
+                            else -> result
+                        }), ContentType.Application.Json, HttpStatusCode.OK)
                     }
                 }
-
-                call.respond(response)
             }
-            get("/updates") {
-                val t = run(databaseDispatcher) {
-                    pool.connection.use { connection ->
-                        val queries = call.queries()
-                        val random = ThreadLocalRandom.current()
-                        val result = mutableListOf<World>()
-
-                        connection.prepareStatement("SELECT * FROM World WHERE id = ?", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY).use { statement ->
-                            for (i in 1..(queries ?: 1)) {
-                                statement.setInt(1, random.nextInt(DbRows) + 1)
-
-                                statement.executeQuery().use { rs ->
-                                    while (rs.next()) {
-                                        result += World(rs.getInt("id"), rs.getInt("randomNumber"))
-                                    }
+
+            call.respond(response)
+        }
+        get("/updates") {
+            val t = run(databaseDispatcher) {
+                pool.connection.use { connection ->
+                    val queries = call.queries()
+                    val random = ThreadLocalRandom.current()
+                    val result = mutableListOf<World>()
+
+                    connection.prepareStatement("SELECT * FROM World WHERE id = ?", TYPE_FORWARD_ONLY, CONCUR_READ_ONLY).use { statement ->
+                        for (i in 1..(queries ?: 1)) {
+                            statement.setInt(1, random.nextInt(DbRows) + 1)
+
+                            statement.executeQuery().use { rs ->
+                                while (rs.next()) {
+                                    result += World(rs.getInt("id"), rs.getInt("randomNumber"))
                                 }
                             }
-
                         }
 
-                        result.forEach { it.randomNumber = random.nextInt(DbRows) + 1 }
+                    }
 
-                        connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id = ?").use { updateStatement ->
-                            for ((id, randomNumber) in result) {
-                                updateStatement.setInt(1, randomNumber)
-                                updateStatement.setInt(2, id)
+                    result.forEach { it.randomNumber = random.nextInt(DbRows) + 1 }
 
-                                updateStatement.executeUpdate()
-                            }
-                        }
+                    connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id = ?").use { updateStatement ->
+                        for ((id, randomNumber) in result) {
+                            updateStatement.setInt(1, randomNumber)
+                            updateStatement.setInt(2, id)
 
-                        TextContent(gson.toJson(when (queries) {
-                            null -> result.single()
-                            else -> result
-                        }), ContentType.Application.Json, HttpStatusCode.OK)
+                            updateStatement.executeUpdate()
+                        }
                     }
-                }
 
-                call.respond(t)
+                    TextContent(gson.toJson(when (queries) {
+                        null -> result.single()
+                        else -> result
+                    }), ContentType.Application.Json, HttpStatusCode.OK)
+                }
             }
+
+            call.respond(t)
         }
-    }.start(true)
+    }
 }
 
 fun ApplicationCall.queries() = try {
@@ -129,7 +126,7 @@ fun ApplicationCall.queries() = try {
 
 private fun hikari(dbHost: String, a: String, b: String): DataSource {
     val config = HikariConfig()
-    config.jdbcUrl = "jdbc:mysql://$dbHost:3306/hello_world"
+    config.jdbcUrl = "jdbc:mysql://$dbHost:3306/hello_world?useSSL=false"
     config.username = a
     config.password = b
     config.addDataSourceProperty("cachePrepStmts", "true")
@@ -137,6 +134,7 @@ private fun hikari(dbHost: String, a: String, b: String): DataSource {
     config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048")
     config.driverClassName = Driver::class.java.name
     config.connectionTimeout = 10000
+    config.maximumPoolSize = 100
 
     return HikariDataSource(config)
 }

+ 11 - 0
frameworks/Kotlin/ktor/src/main/resources/application.conf

@@ -0,0 +1,11 @@
+ktor {
+    deployment {
+        port = 9090
+        autoreload = false
+        watch = [ ]
+    }
+
+    application {
+        modules = [ org.jetbrains.ktor.benchmarks.HelloKt.main ]
+    }
+}