Мы смогли правильно определить глобальный пул соединений.
пользуем Retrofit / OkHttp3 для всего сетевого трафика из нашего приложения для Android. Пока что все идет довольно гладко.
Тем не менее, у нас теперь время от времени заканчивались дескрипторы файлов в нашем приложении / процессе.
Android позволяет использовать до 1024 файловых дескрипторов на процессOkHttp создаст новый поток для каждого асинхронного вызоваКаждый поток, созданный таким образом, будет (по нашему наблюдению) отвечать за 3 новых дескриптора файла (2 канала и один сокет).Мы смогли отладить это точно, где каждый отправленный асинхронный вызов, используя.enqueue()
приведет к увеличению количества открытых файловых дескрипторов на 3.
Проблема в том, чтоConnectionPool
в OkHttp, кажется, поддерживает потоки соединения гораздо дольше, чем они на самом деле нужны. (Эта почта разговоры о пяти минутах, хотя я нигде не видел, чтобы это указывалось.)
Я видел, что можно ограничить количество параллельных вызовов сDispatcher.setMaxRequests()
(хотя кажется неясным, действительно ли это работает, см.Вот) - но это все еще не решает проблему с накоплением открытых потоков и файловых дескрипторов.
Как мы можем помешать OkHttp создавать слишком много файловых дескрипторов?