Прежде всего, создание множества соединений с одного хоста является ошибкой. Вы попадете в узкое место на своем клиентском компьютере, вероятно, задолго до того, как перегрузите свой сервер.
Во-вторых, создание собственного инструмента для нагрузочного тестирования является ошибкой. Для этого уже есть отличные инструменты, такие как wrk , которые решили многие проблемы, которые у вас возникнут.
Теперь к вопросу. Соединения запускаются в разных потоках цикла событий. Вы можете увидеть, как работает следующий код:
private const val port = 8443
fun main() {
val counter = AtomicLong(0)
val vertx = Vertx.vertx()
val client = vertx.createNetClient()
var timestamp = System.currentTimeMillis()
vertx.createNetServer().connectHandler { ctx ->
counter.getAndIncrement()
if (System.currentTimeMillis() - timestamp > 1000) {
println(counter.get())
counter.set(0)
timestamp = System.currentTimeMillis()
}
ctx.end()
}.listen(port)
println("Server started")
ddos(client)
}
fun ddos(client: NetClient) {
for (i in 0..999999) {
client.connect(port, "localhost") {
println(Thread.currentThread().name)
}
}
}
Обратите внимание, что вы также получите гораздо больше тем:
vert.x-eventloop-thread-14
vert.x-eventloop-thread-12
vert.x-eventloop-thread-10
vert.x-eventloop-thread-14
vert.x-eventloop-thread-14
vert.x-eventloop-thread-10
Также обратите внимание, что вам на самом деле не нужно использовать сопрограммы для этого.