wassup?

新ブログ→memo.wass80.xyz

ISUCON10 予選参加 (24位 team😇😇😇)

ISUCON10の予選にteam😇😇😇で参加しました.

結果は24位で通過です.めでたい

やったこと

計測

  • new relic
    • どのrequestが遅いとか,sqlが何回何秒かかってるかわかって便利だった.
  • sql slow log
    • indexが効いてないクエリがたくさん確認できた
    • utgwがforce indexでちまちまindexを適用していた
  • access log
    • utgwがsearch系の検索クエリの種類の統計をとってくれた
    • featuresは2-3回しかクエリが飛んでこないので無視でOK

運用

  • 1台go 2台mysqlで実装
  • 独立したmysqlで両方に同じinsertをした.
  • 乱数ラウンドロビンでselectを分散した.
  • その他色々チューニングをnonyleneがしてくれた.

  • chairとestateの垂直分割が正着っぽい‥

N+1改善

  • nazotteの多角形内部の座標にあるestateをselectがN+1だった
  • 多角形内部の判定をする前に,凸包する矩形で多めにestateをとってきて, 一つ一つ内側か判定していた.
  • 単に一つのクエリにまとめることができる.
  • 10倍ぐらい速くなって,少なくともボトルネックではなくなった.

https://github.com/innocent-team/isucon10q/commit/051ece1bb50e3b23c4ae2f49de9c2f75bc8e7f4f (そのうち公開)

SELECT * FROM estate
    WHERE latitude <= ? AND latitude >= ?
    AND longitude <= ? AND longitude >= ?
    AND ST_Contains(ST_PolygonFromText(?), POINT(latitude, longitude))
    ORDER BY popularity DESC, id ASC
    LIMIT ?

できなかったこと

  • low_pricedのキャッシュを実装したが,効果がなくrevert.
  • 唯一のupdate要素のchair.stockをDBから引き剥がす実装もしたが,こっちはfailedしたの諦め.

感想

  • 今年はgolang書くのにすでになれていたので,実装で困ることは少なかった.
  • ISUCONのための言語だなとつくづく思う
  • ちゃんと一番重大なボトルネックから順番に対処できてよかったと思う.