Open kokoichi206 opened 1 year ago
『Slow web responses to mobile devices clog my apache workers』を参考にして、apache の Keep-alive を off にしてみる
全ての画像取得が 1 秒ほどで返ってくるようになった?
1001316
アクセス先 | 時間 (ms) |
---|---|
メイン HTML ドキュメント | 2.2 |
members API | 44.6 |
写真 jpeg | 4.6 ~ 1001 |
以下のように設定してみた。
KeepAlive の対応で、apache の返す処理自体は早くなった気がする(ブラウザ確認)。 ただ、アプリからアクセスした際には、いまだに遅いまま(何かアクセス以外で時間かかってそう)。
そこで、Android の API 呼び出し部分にもログを仕込み時間を調査した。
Interceptor を用意し、Retrofit に噛ませる
internal class LoggingInterceptor : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request: Request = chain.request()
val t1 = System.nanoTime()
val response: Response = chain.proceed(request)
Log.d("hoge", "${response.request.url}, ${(t2 - t1) / 1e6}, ${response.headers}")
Timber.tag("hoge").d("${(t2 - t1) / 1e6} m sec")
return response
}
}
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(LoggingInterceptor())
.build()
return Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(SakamichiApi::class.java)
結果
apache 処理時間 | Retrofit 処理時間 |
---|---|
40.265 m sec | 12580.46725 m sec |
以下のように、Retrofit 作成時に connectionTimeout を指定。
val okHttpClient = OkHttpClient.Builder()
// ここ!
.connectTimeout(500, TimeUnit.MILLISECONDS)
.addInterceptor(LoggingInterceptor())
.build()
return Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create())
.build()
.create(SakamichiApi::class.java)
結果
apache 処理時間 | Retrofit 処理時間 |
---|---|
42.866 m sec | 931.092245 m sec |
方針的に良さそうだが、画像は遅いまま。 現状、jetpack compose 用の coil を使って画像読み込みしているが、そこに Timeout 情報がないからか。
→ apache の方に Timeout を持たせたら?
ConnectionTimeout を設定したら解決するということは、モバイルの時のみなぜかコネクションが閉じてない、っていうことっぽい。
通信を待っている間の UI について、こちらの記事を参考に考えてみた。
スケルトンスクリーン なるものが今きてるっぽい?
apache の処理の仕方を変更し、問題を解消する
調査チケット: https://github.com/android-project-46group/android/issues/66
別チケットで調査済み