Я выполняю http-тест, используя OkHttp 3.5.0. Я отправляю тысячи запросов на один и тот же URL.
Я ожидаю, что OkHttp-клиент использует ConnectionPool и повторно использует свои соединения снова и снова. Но если мы посмотрим на netstat
, мы увидим много соединений в состоянии TIME_WAIT:
TCP 127.0.0.1:80 127.0.0.1:51752 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51753 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51754 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51755 TIME_WAIT
TCP 127.0.0.1:80 127.0.0.1:51756 TIME_WAIT
...
После пары тысяч запросов я получаю SocketException: No buffer space available (maximum connections reached?)
Код, формирующий запросы (Kotlin):
val client = OkHttpClient.Builder()
.connectionPool(ConnectionPool(5, 1, TimeUnit.MINUTES))
.build()
val request = Request.Builder().url("http://192.168.0.50").build()
while (true) {
val response = client.newCall(request).execute()
response.close()
}
Если вместо response.close()
я использую response.body().string()
, то SocketException
не происходит, но netstat
по-прежнему показывает много соединений TIME_WAIT, и производительность бенчмарка становится все ниже и ниже.
Что я делаю неправильно?
PS: я пытался использовать Apache HttpClient и его PoolingHttpClientConnectionManager
, и, похоже, он отлично работает. Но я хотел бы выяснить, что не так с OkHttp.
threadCount
? - person Jesse Wilson   schedule 07.12.2016response.body().string()
выполняетclose()
после потребления. - person J. Snow   schedule 07.12.2016threadCount
из примера кода. Это было просто несколько ядер. - person J. Snow   schedule 07.12.2016