
<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>ISUCON | monolog</title>
	<atom:link href="https://blog.monora.me/tag/isucon/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.monora.me</link>
	<description>monora log #=&#62; ものろーぐ</description>
	<lastBuildDate>Tue, 26 Jul 2022 18:54:42 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.1</generator>
<site xmlns="com-wordpress:feed-additions:1">21279848</site>	<item>
		<title>ISUCON12 予選に参加しました (最終スコア15532点)</title>
		<link>https://blog.monora.me/2022/07/participated-in-isucon12-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=participated-in-isucon12-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Tue, 26 Jul 2022 18:01:43 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=2405</guid>

					<description><![CDATA[<p>2022年7月23日 (土) に開催された ISUCON12 の予選に「DJ起床失敗とMC布団 w/o MC布団」として id:h-otter と参加しました。 言語は Go、最終スコアは15532点、参考スコアを上から [&#8230;]</p>
The post <a href="https://blog.monora.me/2022/07/participated-in-isucon12-qual/">ISUCON12 予選に参加しました (最終スコア15532点)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>2022年7月23日 (土) に開催された ISUCON12 の予選に「DJ起床失敗とMC布団 w/o MC布団」として <a href="https://h-otter.hatenablog.jp/">id:h-otter</a> と参加しました。</p>



<p>言語は Go、最終スコアは<strong>15532点</strong>、<a href="https://isucon.net/archives/56838276.html">参考スコア</a>を上から数えると<strong>45位</strong>だったようです。悔しい。<br />具体的な取り組みは下の方で述べますが、MySQL移行はバグなく完遂し、さてここからチューニングしていくぞ！という感じのところで終わりました。エンジンが掛かるまでの速度が足りなかった。</p>



<figure class="wp-block-image size-large"><img width="640" height="342" src="https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-640x342.jpg" alt="" class="wp-image-2412" srcset="https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-640x342.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-320x171.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-200x107.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-768x411.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a-1536x822.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/821f8740d91c148254ae8f29eb6f836a.jpg 1686w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>毎回、運営の皆様にはいくら感謝しても足りませんが、今回も取り組みがいのある問題で楽しかったです。ベンチマーカーも最後まで待ち時間がほぼなく、スコアも安定していたのでとてもストレスフリーでした。ありがとうございました。</p>



<p>マルチテナントで大量の SQLite3 データベースがあることが分かったとき、ISUCON本を読んだだけの人間には解かせないってことね!と思いながらニコニコしました。</p>



<p>ところで知り合いがたくさん著者に名を連ねている<a href="https://amzn.to/3J29GVW">ISUCON本</a>ですが、予選の2週間前に購入し、予選開始1時間前に部屋から発掘されました。<br />30分ぐらいで流し読みしたのですが、大変実利的な内容に溢れているなあと感じました。nginx の upstream で keep-alive を有効にする方法は知らなかった……</p>



<figure class="wp-block-embed is-type-rich is-provider-twitter wp-block-embed-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">今日までに読もうと思って積んでいた本です。今日発見しました <a href="https://t.co/RSsbxMkoFD">pic.twitter.com/RSsbxMkoFD</a></p>&mdash; kyontan (@sukukyon) <a href="https://twitter.com/sukukyon/status/1550642844624617473?ref_src=twsrc%5Etfw">July 23, 2022</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<span id="more-2405"></span>



<h3>9:00 起床</h3>



<p>前日も早く寝るぞと自分に言い聞かせながら4時半まで起きてしまい、念には念で8時に掛けた目覚ましが1時間鳴っていました。すでにこの時点で心も体も終わっています。</p>



<p>部屋の隅にISUCON本が積まれているのを発見しました。<a href="https://amzn.to/3PxJipt">ちいとぽ</a>も積まれています。<br />h-otterと合流するために移動しつつ、パラパラと眺めます。</p>



<h3>10:00</h3>



<p>まだ合流のため移動中ですが予選が始まっているようです</p>



<h3>10:05</h3>



<p>合流しました。 CloudFormation テンプレートを流します</p>



<h3>10:22 初回スコア 2732</h3>



<p>起動したのでベンチを回しました。この時点で分担も何も決まっていません。</p>



<p>とりあえず kataribe を入れたり pt-query-digest を入れたりします。<br />「そういえば先日の社内ISUCONで Cloud Profiler 便利だったな……」みたいなことを思いながら、入れ方を調べます。<br />GCPプロジェクトが必要らしいので作ったり、サービスアカウントキーを発行したりします。予選始まってからやることではない。</p>



<h3>11:30ごろ</h3>



<p>Cloud Profiler を入れたので眺めました</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="251" src="https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-640x251.jpg" alt="" class="wp-image-2406" srcset="https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-640x251.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-320x126.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-200x79.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-768x302.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-1536x603.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/3aa8c1532fe9417aa4141a1860fd5623-2048x804.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>SQLite だね〜という感想。</figcaption></figure>



<h3>12:00</h3>



<p>h-otter が MySQL 対応の実装を終わらせて、「Uber eatsでも呼ぶか〜」と言いながら、なぜか歩いてマクドナルドに飯を買いに行きます。なんで??</p>



<h3>13:03 MySQL移行 3023点</h3>



<p>MySQL移行が一段落します。今思うと速かった。</p>



<p>sqlite から SQL をダンプしてゴニョゴニョやり始めて十分程度経ったあと、 <code>sqlite3-to-sql</code> って名前のスクリプトあるけど?? と気付いて笑ってました。先に気付こうね。</p>



<p>とりあえず MySQL に流し込むこと数分、INSERT が一向に終わらないことに気が付きます。このままでは <code>POST /initialize</code> がタイムアウトしてしまうため、バルクインサートをするクエリに書き換えることにしました。</p>



<p>sed で気合でバルクインサートに書き換えましたが遅い。ここで1台目のインスタンスがメモリを食いつぶして死にます。160万件のINSERTを一発でやると死ぬことが分かる。<br />先日の社内ISUCONでもインスタンスのメモリを食いつぶしたんだよな……と思いながら1台目を捨てます。</p>



<p>これが答えです。</p>



<pre class="wp-block-code"><code>for i in `seq 1 100`; do echo $i; mv $i.sql $i.sql.bak; sed -z -e "s/);\n/);\n\n/" -e "s/NULL\n);/NULL\n);\n\n/g" -e "s/);\nINSERT INTO &#91;a-z_]* VALUES/)\n,/g" $i.sql.bak &gt; $i.sql; done</code></pre>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-640x302.jpg" alt="" class="wp-image-2408" width="640" height="302" srcset="https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-640x302.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-320x151.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-200x95.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-768x363.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-1536x726.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/7a8c7f354c775e1cf36854c39890c9ae-2048x968.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>それなりに早くなりましたが、まだ遅いので tenant の player_score テーブルにおいて、 updated_at が一定以上のレコードを DELETE する作戦に切り替えます。これで10秒程度で POST /initialize が通るようになりました。</p>



<pre class="wp-block-code"><code>DELETE FROM tenant_X.player_score WHERE updated_at &gt; 1654041599;
DROP TABLE tenant_X.competition;
DROP TABLE tenant_X.player;</code></pre>



<p>他のチームの参加記を読んだら 「<code>/var/lib/mysql</code> をコピーする」「毎回 mysqldump を実行する」みたいな筋肉実装が多くて震えました……</p>



<p>確かここらへんで h-otter がなぜか flock を倒す実装を書くもベンチがコケました。<br />「そこはボトルネックじゃないっぽいし一旦revertしよ?」と、人の競技中の努力を無に帰すような心無い発言をしました。ごめんなさい。</p>



<p>なぜかここからしばらく無の時間が続きます。なぜ……</p>



<h3>15:20 3758点</h3>



<p>h-otter が competitionRankingHandler の N+1 を潰したようです。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="323" src="https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-640x323.png" alt="" class="wp-image-2410" srcset="https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-640x323.png 640w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-320x161.png 320w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-200x101.png 200w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-768x388.png 768w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-1536x775.png 1536w, https://blog.monora.me/wp-content/uploads/2022/07/e8db1bd829ae516c4856e01202912365-2048x1033.png 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>15:50 6336点</h3>



<p>グッとクエリを睨んで indexを追加。<code>playerAddHandler</code> がかなり速くなりました。</p>



<pre class="wp-block-code"><code>ALTER TABLE visit_history ADD INDEX (competition_id, player_id, created_at);
ALTER TABLE visit_history ADD INDEX (created_at);
ALTER TABLE tenant_X.player_score ADD INDEX (competition_id, player_id, row_num DESC);</code></pre>



<p>マルチテナントのDBをそのまま持ってきたので、tenant_id は無視するようにしました。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="225" src="https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-640x225.jpg" alt="" class="wp-image-2411" srcset="https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-640x225.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-320x112.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-200x70.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-768x270.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-1536x539.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/972569bfa063fe01a93c6e5a51327b27-2048x719.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>16:08 7923点</h3>



<p>h-otter が <code>playerHandler</code> の N+1 を潰したようです。</p>



<p>そして <code>player_score</code> に index を追加。<br /><code>ALTER TABLE player_score ADD INDEX (player_id, competition_id);</code></p>



<p>バルクインサートと、JSONシリアライザの変更(encoding/json → <a href="https://github.com/goccy/go-json">goccy/go-json</a>)をした結果、スコアがやや増加しました。(8269点)</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="175" src="https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-640x175.jpg" alt="" class="wp-image-2415" srcset="https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-640x175.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-320x88.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-200x55.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-768x210.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-1536x420.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/d402be907bf0ee74f9251569549ca330-2048x560.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>16:36 10253点</h3>



<p>なんかヤバそうな実装の dispenseId を倒しました。1万点突破。<br />よくわからんけど順序保証されてたほうが良さそうな気がしたので、 time.Now().UnixNano() を文字列にしてそのまま突っ込みました。爆速。</p>



<p>たしかこのあたりで、 tenant の <code>player_score</code> は <code>(tenant_id, competition_id, player_id)</code> ごとに最新の1行だけあればいいことに h-otter が気付きましたが、あまり速くならず。<br />この時点で row_num に関する index を落とすべきでした。</p>



<p>既存の <code>tenant_{1..100}</code> に対してもそれを適用しましたが、スコアとしては特に変化なしでした。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="188" src="https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-640x188.jpg" alt="" class="wp-image-2414" srcset="https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-640x188.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-320x94.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-200x59.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-768x226.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-1536x452.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/69e135768348aefdc430576563a0b8fb-2048x602.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>このあたりでベンチマーカのログから、タイムアウトでユーザーが減ったという表示がなくなり、ようやくISUCON始まったな! という気持ちになります。すでに手遅れ。</p>



<h3>17:03 12505点</h3>



<p>h-otter が jwt のパース結果をキャッシュします。神</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="236" src="https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-640x236.jpg" alt="" class="wp-image-2417" srcset="https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-640x236.jpg 640w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-320x118.jpg 320w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-200x74.jpg 200w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-768x283.jpg 768w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-1536x566.jpg 1536w, https://blog.monora.me/wp-content/uploads/2022/07/8b40f5fa7a5b915e094f0c19106aaaf3-2048x754.jpg 2048w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<h3>17:45 14363点</h3>



<p>app + DB の2台構成にした気がします。</p>



<h3>17:50 15962点</h3>



<p>流石にやや諦めムード。ログを切ったりできることをしました。<br />忘れずDEBUGログを切ったりスロークエリーを切ったりしました。偉い。</p>



<p>「再起動試験はしなくていいでしょ！」で終了</p>



<h2>感想</h2>



<ol><li>MySQL 移行をバグらせずに完遂できた俺達は偉い (本当に偉いと思っている)</li><li>毎回意味不明なバグを仕込んで後半暗澹たる感じにあるので、今回はほぼ最後までノーバグで駆け抜けられたのは良かった。良くも悪くも我々は大人になった</li><li>プロファイラ / スロークエリ / アクセスログの3本柱をちゃんと見ながら走れたのは本当に良かった。常に事実は正しい。fact based / metrics-driven</li><li>後半のスコアのブチ上がり方が楽しかった。というかここに来るまでを自分は第一関門を突破した段階だと思っている。やれる改善はたくさん残っていたし、あと1時間あれば更に2倍, 3倍のスコアは出ていたんだろうなと思うと悔しい</li></ol>



<p>そのほか</p>



<ol><li>午前中からの競技は本当に心も体も終了していて何も捗らなかった。ISUCONに必要なのは健康な心と身体</li><li>デカいテレビで h-otter がリゼ・ヘルエスタと名取さなの原神ガチャ配信をずっと流していた。「縁起がいいと思ったんだけどなあ」って何?</li><li>その後はリゼがパワプロしてた。リゼ・ヘルエスタについて私が知っているのは第一第二第三皇女のいずれかであるということぐらいです。</li><li>最後1時間ぐらいローテンションお嬢様 (壱百満天原サロメ)流したら集中力が0になった。何?</li></ol>



<p></p>The post <a href="https://blog.monora.me/2022/07/participated-in-isucon12-qual/">ISUCON12 予選に参加しました (最終スコア15532点)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2405</post-id>	</item>
		<item>
		<title>ISUCON10 予選の参加ログ (チーム: 再起動非対応, 最終スコア1997, 40位ぐらい)</title>
		<link>https://blog.monora.me/2020/09/reboot-not-supoprted-at-isucon10-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reboot-not-supoprted-at-isucon10-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Mon, 14 Sep 2020 15:42:37 +0000</pubDate>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[インフラ]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=2169</guid>

					<description><![CDATA[<p>こんばんは、kyontanです。 前々回再起動試験で落ちたのでチーム「再起動非対応」で参加しました。チーム名は前日まで考えていましたが変えるのを忘れました。言語はGo, ベストスコアは2101, 最終スコアは1997で、 [&#8230;]</p>
The post <a href="https://blog.monora.me/2020/09/reboot-not-supoprted-at-isucon10-qual/">ISUCON10 予選の参加ログ (チーム: 再起動非対応, 最終スコア1997, 40位ぐらい)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>こんばんは、kyontanです。</p>



<p><a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">前々回</a>再起動試験で落ちたのでチーム「再起動非対応」で参加しました。チーム名は前日まで考えていましたが変えるのを忘れました。<br />言語はGo, ベストスコアは2101, 最終スコアは1997で、多分40位ぐらいでした。悔しい〜〜</p>



<p>本チーム「再起動非対応」は同期3人 (自分 @kyontan, <a href="https://hogashi.hatenablog.com/">@hogashi</a>, <a href="https://h-otter.hatenablog.jp/">@h-otter</a>) です。このメンバーで4回目の参加です。学生はうち2人なので、一般チームです。</p>



<span id="more-2169"></span>



<p>今回は直前まで対策が無で、前々日ぐらいに「そろそろ予選ですね」みたいなことを言ったら「前日は酒を飲む予定があるんだった」みたいな感じになり、そういえば僕も酒を飲む予定があったわね……という感じでした。</p>



<p>当日の様子は @hogashi がかなりいい感じに時系列でまとめてくれていた、ので読みながら書いています。特に自分がやっていないことも自分がやったかのように書いてあります。そんなことはない。</p>



<p>0:00: そろそろやるかとなり、自宅のLinuxサーバにISUCON9 の予選問題を展開して、長らく使っていなかったMySQL筋やnginx筋,Go筋などのストレッチをしました。ここまでプログラミングってなんだっけ?状態</p>



<p>2:00: この段階で重大な伏線を仕掛けており、MySQL 8.x での追加機能に触れています。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="276" src="https://blog.monora.me/wp-content/uploads/2020/09/f9a6d0fa5754f2e881e11f72578b545a-640x276.png" alt="" class="wp-image-2172" srcset="https://blog.monora.me/wp-content/uploads/2020/09/f9a6d0fa5754f2e881e11f72578b545a-640x276.png 640w, https://blog.monora.me/wp-content/uploads/2020/09/f9a6d0fa5754f2e881e11f72578b545a-320x138.png 320w, https://blog.monora.me/wp-content/uploads/2020/09/f9a6d0fa5754f2e881e11f72578b545a-200x86.png 200w, https://blog.monora.me/wp-content/uploads/2020/09/f9a6d0fa5754f2e881e11f72578b545a-768x331.png 768w, https://blog.monora.me/wp-content/uploads/2020/09/f9a6d0fa5754f2e881e11f72578b545a.png 774w" sizes="(max-width: 640px) 100vw, 640px" /><figcaption>本番に思い出されることはなかった降順インデックス</figcaption></figure>



<p>ついでに、勝手に MySQL 8.x が来ると確信したので、クエリキャッシュ系のコンフィグをテンプレからコメントアウトします。伏線は張れるだけ張る。</p>



<p>8:00: 目覚ましを掛け、おぼろげな意識の中、開始時間が伸びたことを知り二度寝。この時点で優勝を確信する (遅い時間ほど頭が回るため)</p>



<p>11:00: 起きてzoomを繋ぐ。 @hogashi は前回競技中にやっていた洗濯を終わらせる。</p>



<p>12:20: 開始。サーバ一覧が出ないね〜って言いながら謎のgistを見たらIPが乗っていたのでつなぎにいく。ベンチマークがしばらく回せなかったので、とりあえずMySQL 5.7だね〜とか言ったり、コードを眺めたりアプリを触ったりする。<br />なぞって検索を見て、そういえば最近お仕事でGISやったな〜 <code>SPATIAL INDEX</code>で一発優勝ってマジ? などと、一人で優勝を確信する(大嘘)<br />featureの検索高速化したいね〜などと議論しつつ、各featureをbitに対応させて数値検索とかしても速くならんだろうし、いわゆるN:Nのタグ付けを実装するパターンでやるかなーみたいな会話をする。</p>



<p>なお、お題の推測は外す。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="118" src="https://blog.monora.me/wp-content/uploads/2020/09/4d702012116dcb8d1a1ccf0590c4bf0e-640x118.png" alt="" class="wp-image-2177" srcset="https://blog.monora.me/wp-content/uploads/2020/09/4d702012116dcb8d1a1ccf0590c4bf0e-640x118.png 640w, https://blog.monora.me/wp-content/uploads/2020/09/4d702012116dcb8d1a1ccf0590c4bf0e-320x59.png 320w, https://blog.monora.me/wp-content/uploads/2020/09/4d702012116dcb8d1a1ccf0590c4bf0e-200x37.png 200w, https://blog.monora.me/wp-content/uploads/2020/09/4d702012116dcb8d1a1ccf0590c4bf0e-768x142.png 768w, https://blog.monora.me/wp-content/uploads/2020/09/4d702012116dcb8d1a1ccf0590c4bf0e.png 1104w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>13:00: 初期スコア 471 を確認。MySQL のスローログ入れたり基本的なチューニングとか nginx の静的ファイルキャッシュとかする。なおクエリキャッシュはコメントアウトされていたのでそのまま忘れ去った。</p>



<p>13:30ごろ: Visual Studio Code の Remote Development + Live Sharing のセットアップ中に1台目からsshの応答が返ってこなくなる。ディスクが遅いのは知っていたが、まじか〜となり、3台目に作業環境を移す。サポートに再起動のお願いをする。 (ちなみに数十分後にサーバから応答が返ってきた)</p>



<p>13:55: なぞって検索を MySQL GIS 使って高速化やるぞ、となる。GEOMETRY型のカラムを足していい感じにやる。初期実装の POINT(x, y) における緯度経度のタプルの順序が、一般的なGISにおけるそれと逆でン゛ッとなる。</p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">「著名なRDBのGISはなぜかPOINTのX/Yが緯度/経度じゃなくて経度/緯度なんだよね〜(博識アピ)」「ベンチマーカ通らん」「このアプリ、緯度/経度を前提に書かれてるじゃん」</p>&mdash; 趣味は睡眠、特技も睡眠 (@sukukyon) <a href="https://twitter.com/sukukyon/status/1304852378877792256?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p>14:12: 椅子を回転してドアに入るか試したりしていた。入ったらしい (詳細不明)</p>



<p>15:27: nginx で bot ブロックをする。結局これがどのくらい効いているのかは不明だった。</p>



<p>15:39: GEOMETRY の改修が終わる。スコアは 829</p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">SPATIAL INDEXを追加して勝った気になって7時間ぐらい人の作業を眺めていたところ終わった回</p>&mdash; 趣味は睡眠、特技も睡眠 (@sukukyon) <a href="https://twitter.com/sukukyon/status/1304851763267166208?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p>16:13: とりあえずDBとappを分けて2台構成に。インデックスとかもいい感じにやる (降順インデックスなどは気付いていない)。スコアは 1345<br />この時点で2位に躍り出る。記念にスクショ</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="200" src="https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea-640x200.png" alt="" class="wp-image-2174" srcset="https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea-640x200.png 640w, https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea-320x100.png 320w, https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea-200x63.png 200w, https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea-768x240.png 768w, https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea-1536x480.png 1536w, https://blog.monora.me/wp-content/uploads/2020/09/01c7b75546af9321f5d791796341a4ea.png 1592w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>16:35: トップページに表示する最安の物件/イス20件をオンメモリキャッシュするが大して変わらず。</p>



<p>16:40ごろ: 3台目で Visual Code Remote Development + Live Sharing したらまた応答が返ってこなくなり2度目の解散。(18:00ごろに返ってきたらしい) 2台目に移る。ついでにポータルも繋がらなくなる。<br />「『計測するな、推測せよ』ってかｗ」</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="61" src="https://blog.monora.me/wp-content/uploads/2020/09/e02ffc9d872f54d94a17298b103a7941-640x61.png" alt="" class="wp-image-2175" srcset="https://blog.monora.me/wp-content/uploads/2020/09/e02ffc9d872f54d94a17298b103a7941-640x61.png 640w, https://blog.monora.me/wp-content/uploads/2020/09/e02ffc9d872f54d94a17298b103a7941-320x31.png 320w, https://blog.monora.me/wp-content/uploads/2020/09/e02ffc9d872f54d94a17298b103a7941-200x19.png 200w, https://blog.monora.me/wp-content/uploads/2020/09/e02ffc9d872f54d94a17298b103a7941-768x73.png 768w, https://blog.monora.me/wp-content/uploads/2020/09/e02ffc9d872f54d94a17298b103a7941.png 1068w" sizes="(max-width: 640px) 100vw, 640px" /></figure>



<p>17:00: @h-otter がいい感じに chair と estate の  feature 検索の改善を書き始める。寝不足らしく脳死脳死連呼しながらもテストコードを書きながら直してて偉い。これがTDDってやつね。<br />この実装はオンメモリ実装とDBのクエリでやる実装の2種類を考えていて、僕はDBを使った実装を書いていたがinitializeがかなり遅くなってしまった &amp;&amp; @h-otter のオンメモリ実装が先に終わったこと (かつそちらの方が早くなりそう) もあり、そちらを採用。</p>



<p>19:22: ↑の実装が終わる。スコア654 。本当に?ってなってインデックス効いてるか見たら外れてた。入れる。スコア 2078<br />たしかこのあたりで15位ぐらい。勝ったなとか言う (勝ってません)</p>



<p>19:30: まだ色々できることはあるけど30分ぐらいでバグらずにできる自信はないね〜となり、細かい変更をちょいちょい入れる。 nginx の <code>client_body_buffer_size</code> を大きくするとか。POST系のペイロードがでかいのは気付いていたが、中身が何なのかわかっていなかった。あきらかに1件の大きさじゃないよな……とは思っていたが…… (複数件同時に投稿されていたことは終了後に知る)</p>



<p>20:00: ベンチを延々叩いて(不)安定性を確認する。なんか検索を改善した部分が若干バグっているっぽくてランダムで落ちる。原因はわからなかったので特にコードは修正せず。不安要素は最小化しましょうということで、とりあえずスコアに貢献してなかったトップページの安い順トップ20のキャッシュはrevert。POST系のペイロードがでかいのはこのあたりで気になっていたが、1件ではなく複数件を追加するリクエストだったことには終わるまで気付かなかった。</p>



<p>20:30: チーム名を思い出す。再起動試験。再起動して実行したらアプリが落ちてて焦る。DBが先に上がってないと落ちることを思い出す。systemdの気持ちになって無限再起動するように設定。OK。</p>



<p>20:45: 適当にベンチを何回か叩く。1997が出る。「どうする?」「ん〜〜〜」「でも最後ってみんなベンチ叩いてるから(CPUとかネットワークの利用率が上がって)スコア落ちたりするよね〜」「じゃあこれで終わりで」最後に再起動する。initialize が通ることを確認。ここでタイマーストップ</p>



<p>20:50: 乾杯</p>



<p>23:00: discordを見つつ、結果出ないね〜と言いつつ、名取さなの fall guys 配信のアーカイブを見る。ISUCONの運営インタビュー?みたいなやつの記事を見たら、とある先輩の顔写真がめちゃくちゃ高解像度で大爆笑する。毛穴までクッキリ。exiftoolを叩くも特に何も残っていない。</p>



<p>23:30ごろ: 生放送で順位が出る。おらんやんけ！！！！！！！ 解散</p>



<p>26:00ごろ: 入眠</p>



<p>最終的なスコアを見た感じ、あと100点ちょいって感じだったので、あと何か1つ出来ていれば本選に行けたでしょう。検索改善はまだ手が残っていたし、estateとchairのDB分けられたね〜とか終わった直後に気付いて「『アッ』」ってなったし、MySQL 8.0 にするだけで SPATIAL INDEX は速くなった可能性があるし、なんならクエリキャッシュだけでも良かったかもしれない。色々できた気がする。</p>



<p>ところで「まだ何かできそう」とアイデアが思いつくのは色々と課題を分析できている証拠だと思っていて、それをちゃんと実装までできるスキルもあるチームメイトはやはり優秀だと思う。今回は特に分析→仮説→改善→振り返りのサイクルをしっかり回せたので、今後にも活きることでしょう。<br />改善できるネタが思いつくということは、自分たちのチームが勝っていた世界線もあるということです。あとは前日の睡眠をしっかり取ればちゃんと勝てるはず。</p>



<p>来年はインターネットや書記や洗濯が得意な社会人と、インフラとチーム開発とアニメ鑑賞が得意な社会人と、睡眠が得意な社会人(笑)の3人で参加したいです。開始時間は12時だと助かります。ありがとうございました。</p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">人生1回ぐらいは本選出たいがち</p>&mdash; 趣味は睡眠、特技も睡眠 (@sukukyon) <a href="https://twitter.com/sukukyon/status/1304848290882572289?ref_src=twsrc%5Etfw">September 12, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="ja" dir="ltr">そんなことよりISUCON本選に行きたかったよな俺たちは……</p>&mdash; 趣味は睡眠、特技も睡眠 (@sukukyon) <a href="https://twitter.com/sukukyon/status/1305361535376568322?ref_src=twsrc%5Etfw">September 14, 2020</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>The post <a href="https://blog.monora.me/2020/09/reboot-not-supoprted-at-isucon10-qual/">ISUCON10 予選の参加ログ (チーム: 再起動非対応, 最終スコア1997, 40位ぐらい)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2169</post-id>	</item>
		<item>
		<title>ISUCON9 予選の参加ログ (チーム: 再起動非対応)</title>
		<link>https://blog.monora.me/2019/09/reboot-not-supoprted-at-isucon9-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=reboot-not-supoprted-at-isucon9-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 08 Sep 2019 13:44:34 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1998</guid>

					<description><![CDATA[<p>こんばんは、kyontanです。 前回再起動試験で落ちたのでチーム「再起動非対応」で参加しました。ベストスコアは4410点でした。再起動試験までたどり着けなかった……悔しい…… チーム「再起動非対応」は同期3人 (自分  [&#8230;]</p>
The post <a href="https://blog.monora.me/2019/09/reboot-not-supoprted-at-isucon9-qual/">ISUCON9 予選の参加ログ (チーム: 再起動非対応)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>こんばんは、kyontanです。</p>
<p><a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">前回</a>再起動試験で落ちたのでチーム「再起動非対応」で参加しました。ベストスコアは<strong>4410点</strong>でした。再起動試験までたどり着けなかった……悔しい……</p>
<p>チーム「再起動非対応」は同期3人 (自分 @kyontan, <a href="https://hogashi.hatenablog.com/">@hogashi</a>, <a href="https://h-otter.hatenablog.jp/">@h-otter</a>) での参加でした。学生は2人いたはずですがエントリーをミスったので学生は1人ということになっています。</p>
<p><span id="more-1998"></span></p>
<h3>使用した言語</h3>
<p>私はRubyが一番得意だと思っていますが、非同期処理が書きやすいとか型が着いていると嬉しい、みたいなことはあり今回も<strong>Go</strong>言語です。<br />
でも今回はN+1潰すときの型マッピングで無駄に時間を溶かしてしまったので、Rubyの方が良かったかもしれない……つらい……</p>
<h3>開始前の準備</h3>
<p>Prometheus/Grafana等のサーバの設定を @h-otter にお願いしました。前回のコードを読み返しつつ、何をしたかを思い出すなどした。</p>
<p>時間がなくて完全に忘れてしまいましたが、せめて練習はやっておくべきでしたね…</p>
<p>あと、 Alibaba Cloud の UI が色々不思議な感じで良かったですね。</p>
<h3>本番</h3>
<p>完全に正解していますが、今回はマイクロサービス問だということに気が付いたのは開始してからだいぶ経ってからでした。</p>
<blockquote class="twitter-tweet" data-width="550" data-dnt="true">
<p lang="ja" dir="ltr">開始30分前、チームメイトとの雑談「今日は何がでるかなー」「フリマアプリかオークションかそういうやつでしょ」「マイクロサービスとかね」「わかる〜」 <a href="https://twitter.com/hashtag/isucon?src=hash&amp;ref_src=twsrc%5Etfw">#isucon</a></p>
<p>&mdash; kyontan@新刊はまだ (@sukukyon) <a href="https://twitter.com/sukukyon/status/1170651769401069568?ref_src=twsrc%5Etfw">September 8, 2019</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>今回できたことが異常に少ない気がする。kataribeのログを眺めつつ、チームでやったことは以下のことです。比較的時系列だけどそうでない部分もあるかも。</p>
<ul>
<li>開始スコアは <strong>2310</strong></li>
<li>10:30 メモリ多いな〜って思っていたら2, 3台目のインスタンスタイプを間違えていたことに気がつく。インスタンス立て直し
<ul>
<li>コードは既にリポジトリへ追加していたのでチームメイトはルール/コードリーディングを進める</li>
</ul>
</li>
<li>10:50ごろ: 作業開始</li>
<li>11:30ごろ?: MySQL 5.7 を 8.0 へ (@h-otter)
<ul>
<li>スコア変化なし</li>
</ul>
</li>
<li>11:45 DBにインデックスを張る(@kyontan)
<ul>
<li>多分間違えていて、これらにインデックスを貼りましたがあまり効いていなかったようにみえました</li>
<li>BigQuery の触りすぎでRDBのインデックスの挙動をほぼ忘れたのも敗北ポイント</li>
</ul>
</li>
</ul>
<pre class="EnlighterJSRAW" data-enlighter-language="raw">config (name)
items (created_at, id)
items (id)
items (buyer_id)
items (seller_id)
shippings (transaction_evidence_id)
transaction_evidences (id)
transaction_evidences (item_id)
users (account_name)
users (id)
</pre>
<ul>
<li>12:20: カテゴリをオンメモリへ (@hogas, @h-otter)
<ul>
<li><strong>2510点</strong>ぐらい</li>
</ul>
</li>
<li>12:30: http2 対応, 静的ファイルをキャッシュ, アップロードされた画像を nginx で返すなど
<ul>
<li>スコア変化なし</li>
</ul>
</li>
<li>13:30: config もキャッシュするように</li>
<li>14:00: 新着商品には発売中の商品だけを返すようにする (@hogas)</li>
<li>14:45  &#8211; 16:00: <code>GET /users/transactions.json</code><span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;"> の N+1 を潰す (@kyontan)</span>
<ul>
<li><strong>3500点</strong>ぐらい</li>
<li>なぜか色々ハマって2時間半ぐらい溶かしていた。これは敗北ポイント</li>
<li>多分ここらへんでMySQLがサチらなくなっていた気がする
<ul>
<li>CPUがサチっていたことに気が付いていたが原因が分からず (pprofをなぜ見なかったのか……)</li>
</ul>
</li>
</ul>
</li>
<li>15:30: <code>UserSimple</code> が持つ情報は全てオンメモリでキャッシュする
<ul>
<li>ユーザの存在チェックだけするような部分 (権限チェック) も基本的にこれで対応できるのでそうした</li>
<li><strong>4210点</strong>
<ul>
<li>ここからスコア上がらず……</li>
</ul>
</li>
</ul>
</li>
<li>16:00: 同じクエリを何度か叩いているエンドポイントがあったので潰す (@hogas, @kyontan)</li>
<li>16:00ごろ: transactions 以外詰まってないしCPUに余裕があるので campaign (負荷レベル)を弄ったところ外部APIで 403エラー  {&#8220;error&#8221;:&#8221;IP address is not allowed&#8221;} が連発しだす
<ul>
<li>主に<code>GET /users/transactions.json</code> <span style="font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;">での外部 shipment  サービスへのリクエストで連発</span></li>
<li>外部APIへの403はアプリケーション的には500を返す仕様だったので、これが連発してベンチマーカが途中終了し完走しない</li>
<li>ここらへんで手詰まりに</li>
</ul>
</li>
<li>17:00: 明らかに不要な <code>SELECT FOR UPDATE</code> を削除 (4箇所+ぐらい)
<ul>
<li>これかこれの次辺りで<strong>4410点</strong>。これがベストスコア</li>
</ul>
</li>
<li>17:10: 外部APIを叩く部分で exponential backoff を実装 (@h-otter)
<ul>
<li>変化なし / 403 が連発する</li>
</ul>
</li>
<li>17:30: 外部APIをリクエストするエンドポイントだけ2台へ分散する
<ul>
<li>403 の連発は解決せず、なぜ……</li>
</ul>
</li>
<li>18:10: 最終スコア0点 (failed) で終了</li>
</ul>
<p>色々施策を打つもスコアの変化要因が今ひとつ分からず頭が回っていなかったですね。<br />
特に外部API が undocumented な 403 を返す (しかもメッセージは 「許可されていないIPアドレス」) というのは全然分かりませんでした。<br />
マイクロサービス問題なら単一IPから連続でアクセスすると弾くようになっているのかな、などと思い、後半で外部APIへリクエストをするエンドポイントだけ複数台へ分散するなどしていましたが全く解決せず泥沼へ。</p>
<p>これベンチマーカと外部API側に問題あるのでは? みたいな気持ちになりつつ、マイクロサービス問だしちゃんとbackoffとか実行すればいけるでしょ! と思っていましたが、意図したエラーだったのかは未だに分からず……</p>
<p>他の方の感想を見た限りでは、ポータルサイトへ登録されていないIPからのアクセスは弾かれるみたいですが、これについてはUI上で正しく登録されていることを確認したので問題なさそうでした。<br />
11:00 ごろにインスタンスを立ち上げ直してIPを再登録したのがポータルサイトの何らかのエッジケースを踏んだのでは? などと勝手に邪推しています。謎ですね。</p>
<p>そのほか、 campaign の値を変えると何が変わるのか (POST系アクセスが増える?)、みたいなことも終了後にログを分析してようやくなんとなく傾向がわかり悔しい気持ちに。</p>
<h3>感想</h3>
<p>終わってみれば途中重大な気付き (「外部APIのレスポンスキャッシュできるじゃん」「ユーザの嗜好に合わせて商品出し分けたら?」など) があり、見逃しの多い回でした。<br />
bcrypt の件は全く気づいておらず。前回は初手でやった(があまり意味がなかった) pprof を今回なぜ見なかったのか……</p>
<p>短い時間で追い詰められている環境の中でどれだけ集中できる / 気付けるか、というのが重要になると改めて感じました。</p>
<p>コンテストとしては今回も設定が面白く、運営の手の込みようが分かり、かつ短期間で取り組みがいのあるとても良い問題でした。<br />
運営の皆様、大変お疲れさまでした。</p>The post <a href="https://blog.monora.me/2019/09/reboot-not-supoprted-at-isucon9-qual/">ISUCON9 予選の参加ログ (チーム: 再起動非対応)</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1998</post-id>	</item>
		<item>
		<title>ISUCON8 予選に参加して再起動試験に落ちました</title>
		<link>https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=failed-reboot-test-in-isucon8-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 16 Sep 2018 12:35:11 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1864</guid>

					<description><![CDATA[<p>おはようございます。名取さなにハマっている kyontan です。 チーム「hhkb」で同期3人 (自分 @kyontan, @hogashi, @h-otter) 2回目の参加で2日目で Go 実装でした。学生枠突破な [&#8230;]</p>
The post <a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">ISUCON8 予選に参加して再起動試験に落ちました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>おはようございます。名取さなにハマっている kyontan です。<a href="https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129.png"><img loading="lazy" class="aligncenter wp-image-1867 size-medium" src="https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129-320x218.png" alt="" width="320" height="218" srcset="https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129-320x218.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129-200x136.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/a5a52fbc5d024df5c788b1f71ee6d129.png 414w" sizes="(max-width: 320px) 100vw, 320px" /></a></p>
<p><figure id="attachment_1879" aria-describedby="caption-attachment-1879" style="width: 620px" class="wp-caption aligncenter"><a href="https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de.png"><img loading="lazy" class="size-large wp-image-1879" src="https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-640x502.png" alt="" width="620" height="486" srcset="https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-640x502.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-200x157.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-320x251.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/b3747e99d8a088593e5290ae549054de-768x603.png 768w" sizes="(max-width: 620px) 100vw, 620px" /></a><figcaption id="caption-attachment-1879" class="wp-caption-text">最終スコア</figcaption></figure></p>
<p>チーム「hhkb」で同期3人 (自分 @kyontan, @hogashi, @h-otter) 2回目の参加で2日目で Go 実装でした。学生枠突破ならずでした、悔しい。というよりは <strong>55,982点</strong>で全体4位の点数で落ちました。ちなみに hhkb は h-otter, hogashi, kyontan, :boom: ???? の略です。<br />
スキルセット的には、 @h-otter がインフラ(ミドルウェア含)なんでもできる+Goの経験が一番あるマンで、 @hogashi がアプリケーションなんでもできるマンで、 @kyontan はアプリとインフラとDBを一通り見られるマンみたいな感じでした。</p>
<p>今回の参加に向けて、取り組んだことをつらつらと書きます。</p>
<p><span id="more-1864"></span></p>
<p>今回は真面目に本戦に行きたかったので前々日に ConoHa で ISUCON7 の予選を解き直して練習しました。具体的には ConoHa の練習用イメージを使って 1GBプラン x3台で予選環境を再現しました。結果、10時間程度で 5,204点から509,190点まで持っていけることが分かり、計測と試行の反復を効率的に行えば ISUCON の予選は突破できるという確信を深めていました。<br />
また、前回は最後の最後でベンチマーカを走行させた結果点数が下がって落ちたので、前回の直後に「泣きの1回はやらない」というスローガンを掲げ、1年越しでそれを達成しました。</p>
<p><figure id="attachment_1875" aria-describedby="caption-attachment-1875" style="width: 620px" class="wp-caption aligncenter"><a href="https://blog.monora.me/wp-content/uploads/2018/09/score_init.png"><img loading="lazy" class="wp-image-1875 size-large" src="https://blog.monora.me/wp-content/uploads/2018/09/score_init-640x160.png" alt="" width="620" height="155" srcset="https://blog.monora.me/wp-content/uploads/2018/09/score_init-640x160.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/score_init-200x50.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/score_init-320x80.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/score_init-768x192.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/score_init.png 984w" sizes="(max-width: 620px) 100vw, 620px" /></a><figcaption id="caption-attachment-1875" class="wp-caption-text">ベンチマークの初回走行の結果しばらく1位になった</figcaption></figure></p>
<p>事前に準備したのは Prometheus のサーバ (@h-otter がいい感じにやってくれた)と、やること/できることチェックリストぐらいでしょうか。だいたい大会では開始した瞬間にテンパってそのまま撃沈するのが常なので、思考停止状態でもコピペで動くようなコード片とかを用意しておくと便利ですね。あとは思考が無になったときに確認するべき事項とかを作っておくと良いのではないでしょうか? 頻繁に無になって帰りたくなりました。メンタルは大事。</p>
<p>例えば下のような感じです。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3.png"><img loading="lazy" class="aligncenter size-large wp-image-1868" src="https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-640x433.png" alt="" width="620" height="419" srcset="https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-640x433.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-200x135.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-320x216.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3-768x519.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/3bbc737a859d096bd81af29e4991f3e3.png 1062w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<p>当日は3人がローカルで開発し、本番環境のVMへバイナリを転送して検証する、という進め方でやっていました。Go はクロスプラットフォームでのビルドがしやすいのが便利ですね。</p>
<p>具体的にやったことを羅列します。というか @h-otter が書いていたのを未承諾引用します。順番は適当</p>
<ul>
<li><code>SELECT *</code> する系のクエリを必要な列しか取らないようにした</li>
<li><code>/api/users</code> は <code>user_id</code> で <code>reservations</code> を全部とってきて、アプリ側で処理してやったらめっちゃ速くなった
<ul>
<li>ここでベンチマーカが重いと言ってくるエンドポイントが <code>/users/:id</code> から <code>/api/events/:id/actions/reserve</code> になった</li>
</ul>
</li>
<li><code>getEvent</code> を <code>getEventWithoutDetail</code> と分けた</li>
<li><code>getEvent</code> と <code>getEvents</code> を2クエリに</li>
<li><code>sheets</code> へのクエリを消す
<ul>
<li>効果があったのかは良くわからない</li>
</ul>
</li>
<li>MariaDB のチューニング</li>
<li>Prometheus と Grafana で可視化</li>
<li>ログインのクエリを1つに</li>
<li>パスワードを平文で突っ込むようにした</li>
<li>DB にインデックス張った (けどあまり良い結果がでなくてもんにょりした)
<ul>
<li>最初に <code>mysql</code> コマンドでインデックス張ったけど結果が全く変わらなくて、なぜ? と思ったら毎回 <code>/initialize</code> でテーブルを作り直していることに気がついた。</li>
</ul>
</li>
<li>IN句を使いたかったので DBにアクセスするライブラリを sqlx に切り替えた</li>
<li>トランザクションの開始がおかしいところがあったので直したり デッドロック時にエラーを返さずリトライするようにした</li>
</ul>
<p>最後は予約時のシート決定を高速化するコードが安定化しなくて入らなかったり、Redisでいい感じにやろうぜみたいなことを思うだけ思ってやらなかったりしました。多分ここができると数万点上がったはず。</p>
<p>あとはスコアに関係ないけど作業便利になる系として、 エラーログでソースコードの行番号を吐くようにしたり、 <code>Makefile</code> 弄って1コマンドでデプロイできるようにしました。<br />
開発は3台のサーバでバラバラにやっていましたがDBは1台だけを参照するようにしました。これはDBのチューニングとかがあって、1台でやった変更を他に反映したりするのが面倒くさかったので。こうすると、やりたい人間が適当にベンチマーク対象のサーバを変更して実行してやればいいので楽でした。</p>
<p>ソースコードは GitHub で管理し、いい感じにやりました。コミットログは下の通りです。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814.png"><img loading="lazy" class="aligncenter size-large wp-image-1866" src="https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-308x640.png" alt="" width="308" height="640" srcset="https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-308x640.png 308w, https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-96x200.png 96w, https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814-154x320.png 154w, https://blog.monora.me/wp-content/uploads/2018/09/75d9b24b6f7dae18b7cdff0930e9b814.png 559w" sizes="(max-width: 308px) 100vw, 308px" /></a>数字がタグに付いていることがありますが、これはいいスコアが出た時にバイナリごとコミットしてタグつけておこうぜ、みたいな感じにした結果でした。</p>
<p>今回の僕の活躍はよく分からなくて、いい感じデバッグ担当だった気がします。PRを見るなりとりあえずマージしてベンチマーカを落としたりバグ探しをしていたりしました。とにかく @h-otter がぶち壊しつつ @hogashi がいい感じに安定化するコードを書いてくれてよかった感がある。</p>
<p>Webサーバはh2oで十分高速だし、画像のトラフィック詰まりもないしで、とにかくアプリケーションコードの改善に注力した/するしかなかった8時間でした。</p>
<p>最終的に残り30分でベンチマーカを叩いたところ3万点前後のスコアが5万点に若干跳ねてそこで打ち止め。一度再起動をしてブラウザからアクセスできることを確認し天命を待ったところ、無事再起動試験で落ち失格となりました。天命……</p>
<p>(追記: スコアが跳ねたのは、最後に実行先サーバを変えた時に インデックスを張る処理を <code>init.sh</code> に書いたサーバで実行したからかもしれないことを思い出した。)</p>
<p>なぜ失格になったのかは分かっていなくて、おそらく <code>/admin/api/reports/events/:id/sales</code> の処理が遅くて不整合が起きて落ちたのかなあなどと思っていますが、2回連続で落ちるのは運が悪かったなと……</p>
<p>なんやかんやでやることがなくならない8時間で、やることが見つからない8時間よりは良かったのではないかと思います。</p>
<blockquote class="twitter-tweet" data-width="550" data-dnt="true">
<p lang="ja" dir="ltr">ISUCONの予選に向けて昨日は練習をしていたわけだけど、知っていることをちゃんと愚直にできれば比較的現実的な時間で予選突破ラインには十分立てることが分かったので良かった</p>
<p>&mdash; kyontan@新刊はまだ (@sukukyon) <a href="https://twitter.com/sukukyon/status/1040457052307447810?ref_src=twsrc%5Etfw">September 14, 2018</a></p></blockquote>
<p><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p>イキっているなどと言われてもこれは事実だと信じていて、典型的な N+1 を潰すなどすれば予選は通過できるはずなことは分かりましたね。くぅ〜〜</p>
<p>来年はちゃんと本選に行けたらいいですね。頑張りましょう。</p>
<p>そして、参加会場を提供していただいた mixi 様、惜敗の悔しさを教えてくれる最高のコンテストを運営をしていただいたISUCONの運営の皆様、お疲れ様でした、ありがとうございました!</p>
<p>以下は画像です</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/score_2.png"><img loading="lazy" class="wp-image-1877 size-large" src="https://blog.monora.me/wp-content/uploads/2018/09/score_2-640x141.png" alt="" width="620" height="137" srcset="https://blog.monora.me/wp-content/uploads/2018/09/score_2-640x141.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/score_2-200x44.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/score_2-320x71.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/score_2-768x170.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/score_2.png 1000w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<p><a href="https://blog.monora.me/wp-content/uploads/2018/09/score_3.png"><img loading="lazy" class="wp-image-1876 size-large" src="https://blog.monora.me/wp-content/uploads/2018/09/score_3-640x139.png" alt="" width="620" height="135" srcset="https://blog.monora.me/wp-content/uploads/2018/09/score_3-640x139.png 640w, https://blog.monora.me/wp-content/uploads/2018/09/score_3-200x43.png 200w, https://blog.monora.me/wp-content/uploads/2018/09/score_3-320x70.png 320w, https://blog.monora.me/wp-content/uploads/2018/09/score_3-768x167.png 768w, https://blog.monora.me/wp-content/uploads/2018/09/score_3.png 984w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>The post <a href="https://blog.monora.me/2018/09/failed-reboot-test-in-isucon8-qual/">ISUCON8 予選に参加して再起動試験に落ちました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1864</post-id>	</item>
		<item>
		<title>ISUCON7 予選に参加しました</title>
		<link>https://blog.monora.me/2017/10/participated-isucon7-qual/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=participated-isucon7-qual</link>
		
		<dc:creator><![CDATA[きょんたん]]></dc:creator>
		<pubDate>Sun, 22 Oct 2017 17:29:29 +0000</pubDate>
				<category><![CDATA[Infrastructure]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ISUCON]]></category>
		<category><![CDATA[コンテスト]]></category>
		<category><![CDATA[参加しました]]></category>
		<guid isPermaLink="false">https://blog.monora.me/?p=1665</guid>

					<description><![CDATA[<p>チーム「まだチーム名で消耗してるの?」で同期3人 (自分 @kyontan, @hogas, @h-otter) 初参加で2日目でした。学生枠突破ならずでした。 Ruby実装で挑み、最終スコア 38605点@2017-1 [&#8230;]</p>
The post <a href="https://blog.monora.me/2017/10/participated-isucon7-qual/">ISUCON7 予選に参加しました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></description>
										<content:encoded><![CDATA[<p>チーム「まだチーム名で消耗してるの?」で同期3人 (自分 @kyontan, @hogas, @h-otter) 初参加で2日目でした。学生枠突破ならずでした。</p>
<p>Ruby実装で挑み、最終スコア 38605点@2017-10-22 20:59:30, ベストスコア: <strong>67792点</strong>@2017-10-22 20:44:59 でした。<br />
ベストスコアでは予選ラインは超えていたんだなあと思いますが、最終的には伸び悩んだチームも多いようで、結局落ち着くところに落ち着いたのかなと思います。</p>
<p>ソースコードは <a href="https://github.com/kyontan/isucon7_qual">kyontan/isucon7_qual</a> です。踏み台でやっていた影響でコミッタが僕に見えますが、だいたい僕ではない。</p>
<p><figure id="attachment_1668" aria-describedby="caption-attachment-1668" style="width: 620px" class="wp-caption aligncenter"><a href="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart.png"><img loading="lazy" class="wp-image-1668 size-large" src="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-640x254.png" alt="" width="620" height="246" srcset="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-640x254.png 640w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-200x79.png 200w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-320x127.png 320w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart-768x304.png 768w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_chart.png 1696w" sizes="(max-width: 620px) 100vw, 620px" /></a><figcaption id="caption-attachment-1668" class="wp-caption-text">ISUCON7 予選での Score / LoadLevel の変化</figcaption></figure></p>
<p>次回も参加したいなという気持ちになってきたので、ひとまずはやったことを記していきます。</p>
<p><span id="more-1665"></span></p>
<p>実は僕と @hogas は ISUCON6 の夏期講習に出たことがありましたが、そのときには日程等もあり参加しておらずということで、今回が初参加に。<br />
@h-otter というインフラに<strong>とても強い</strong>同期がいたことや、周囲でも参加する人間が何故か多く、とにかくやっていくしかないという流れに。</p>
<p>チーム名を決めるところで消耗/摩耗し、本番前日までSlackはほとんど流れておらず。前日夜になって僕とか @h-otter がぽちぽち参加記やチューニングできそうなところを貼っていく感じに。</p>
<p>最近、正午より前に起きると早起きしたと言い出す僕が時間に間に合っていたあたりで色々とミスっていたんですが、東京都内の某所で3人で集まってやっていました。</p>
<h2>事前にやった</h2>
<p>とりあえずグローバルIPを持つ作業用サーバを用意しておいた。Rubyは事前に入れておいて、開始後に MySQL  も入れてスタンドアロンで動くようにした。あとあと @hogas はここでずっと作業してたり、 @h-otter が Prometheus のサーバを立てたりしていた。便利</p>
<p>コードについては GitHub リポジトリを立てて、普通にブランチ切ってやっていた。便利</p>
<p>情報共有は対面だったので、コードスニペット貼れるしリアルタイムで最高な HackMD を例のごとく使っていた。ベンチマーカの結果を全部ペタペタ貼っていたら容量制限に引っかかり、2スレ目、3スレ目が誕生した。HackMDのタイトルは<strong>「ISUCON7 まだチーム名で消耗してるの? 2スレ目」</strong>でした。</p>
<h2>やったこと</h2>
<p>ミドルウェアより下は正直 @h-otter に丸投げしていたので、アプリケーションより上をぽちぽち見ていました。<br />
インフラについては正直何をしたのかは全容を把握していないですが、初手で nginx や MySQL に基本のチューニングを突っ込み、Prometheus で延々と監視しながらPDCAを回していたっぽい。正しいインフラチューニングや……</p>
<p>言語は僕と @hogas が使い慣れている Ruby を選択しました。正直クエリ弄るぐらいでいいなら Go でもいいよねーって言っていましたが、慣れてるほうが便利でした。Sinatra の文字列には幼馴染のような安心感がある。</p>
<p>僕と @hogas はよしなにアプリケーションコードを読みながら色々した。以下は色々</p>
<h4>erb を haml に置き換える / hamlit gem の導入</h4>
<p>気持ち+2000点ぐらい</p>
<p>初期実装が erb で、erubis に置き換えるというのも一案ありましたが、行きの車内で「erubis hamlit 速度」などで検索した結果やっぱり hamlit かとなっており、ノータイムで haml に書き換えることを決断しました。<br />
erb2haml とかあったね〜と @hogas と話しながらやってもらった。</p>
<p>以下様子です</p>
<blockquote class="twitter-tweet" data-width="550">
<p lang="ja" dir="ltr">. <a href="https://twitter.com/hogextend?ref_src=twsrc%5Etfw">@hogextend</a> 「erb2hamlどうやって使うの?」ぼく「とりあえず rails new して突っ込んでみたら?」 <a href="https://twitter.com/hashtag/isucon?src=hash&amp;ref_src=twsrc%5Etfw">#isucon</a></p>
<p>&mdash; きょんたん (@sukukyon) <a href="https://twitter.com/sukukyon/status/922121692440182785?ref_src=twsrc%5Etfw">October 22, 2017</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<blockquote class="twitter-tweet" data-width="550">
<p lang="ja" dir="ltr">僕「ﾖｯｼｬ(gem install rails)」</p>
<p>&mdash; hogas (@hogextend) <a href="https://twitter.com/hogextend/status/922125423697305600?ref_src=twsrc%5Etfw">October 22, 2017</a></p></blockquote>
<p><script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script></p>
<p><small>(erb2haml はコマンドラインツールとかではなく、Rails に追加する rake タスク群ということに気が付いた様子)</small></p>
<h4>nginx &lt;-&gt; Puma を UNIXドメインソケットに</h4>
<p>気持ち +2000点</p>
<p>定番です。HTTP 5000/tcp から UNIXドメインに変えた。</p>
<h4>SQL のクエリ改善</h4>
<p>気持ち+10000点ぐらい</p>
<p>これは定番ですね。SELECT のカラムを絞ったり (@hogas)、 <code>LIMIT</code> を付けたり (@hogas)、インデックスを張ったりした。N+1 は手を付けていましたが、コード変更に集中できなくて最終的に投げてしまった。悔しい</p>
<p>終了直前にソースコード眺めてたら <code>statement.close</code> を意図的に忘れていそうなコードが見つかり慌てて修正した。スコア上の変化は分からず。</p>
<h4> 画像を静的ファイルに書き出す</h4>
<p>気持ち+15000点ぐらい</p>
<p>ユーザーのアバター画像が DB に <code>blob</code> で入っていたので、雑に Ruby のワンライナーで書き出して (ここまで @kyontan)、 nginx に <code>try_files</code> で食わせる (@h-otter) みたいなことをした。<br />
既に話題になっていますが、最終的には <code>Cache-control</code> 的な問題でキャッシュヒット率が悪かったらしい。むむむ。</p>
<h4>SHA1 を殺す (パスワード, アバター画像)</h4>
<p>気持ち+2000点</p>
<p>パスワードのソルトを生成している <code>random_string</code> を見たときに、これは要らないのではと思ってしまったのが始まり。初期データのパスワードはハッシュ化されていたので、 <code>id</code> が1000より大きい user は全て平文パスワードを DB に突っ込んだりした。 (by @hogas)<br />
アバター画像は、ファイルの内容を SHA1 したものをファイル名に使用する実装になっていましたが、もしかしていけるのではと言いながらユーザIDをそのままファイル名にしたら通ってしまったのでそのままに。</p>
<h4>Redis (最終的に入れず)</h4>
<p>気持ち+2000点ぐらい(?)</p>
<p>画像をバイナリで入れるのはまあそうだね〜〜と言いながら、Redis に載せようとしていた。正直コードの変更は大したことがないのは分かっていたので実装はシュッとできたけれど、実際に動かしてみると意外とスコアに有意な差が出なかった。その後も永続化周りで少し足踏みしていたり、他の変更を見ていたために最終的に入れられなかった。残念</p>
<h4>アプリケーションサーバ3台化</h4>
<p>気持ち +3000点ぐらい</p>
<p>@h-otter がラスト30分でイケると言い出してやってた。ここで Puma (アプリケーションサーバ) のスレッド数を調整していた (10 -&gt; 18スレッド)時に出したのがベストスコアです。</p>
<h2>その他</h2>
<ul>
<li>再起動試験は何の問題もなかった????
<ul>
<li>過去の参加記なんかを見てるとここが関門かなというのはあったので絶対やっておきたかった (やりました)</li>
<li>Redis に手を出してなかったのでここで不安はあまりなかった</li>
</ul>
</li>
<li>MySQL の Too Many Connections が割りと頻発した
<ul>
<li>ここは <code>statement.close</code> 忘れも影響してるかなと思うけれど、500が途中で出たり安定しないことがあった。最終的には安定しました</li>
</ul>
</li>
<li>日ごろは頭痛の頭の字もないのに、とにかく頭痛が酷かった。緊張にはやはり弱い。</li>
<li>JSONシリアライザが遅いのは分かっていて、 <code>Oj</code> を入れるぞと言いながら入れるのを忘れた。あれを入れただけでシリアライズについては数倍速くなるというのは分かっていたので、ただただつらい。</li>
<li>ICTトラブルシューティングコンテストでスコアサーバを延々とやっていたことが知見として生きたとは思う。DB設計なりアプリケーション設計なりチューニングなり。
<ul>
<li>当時のオーバーキルなチューニングしたときの操作が生きることになるとは思ってなかった</li>
</ul>
</li>
<li>最後のベンチマークの結果を見て全員で嘘やんって言ってた
<ul>
<li>ルールを読んでなかった。次回は読みます</li>
<li>にゃーん</li>
</ul>
</li>
</ul>
<p>そういえば30分ほどですがスコアボードの上位に乗っていました。学生トップなのは分かっていたので、これは予選突破できるんじゃない? とか言いながら笑っていたのを覚えています。このあたりが後々ボーダーになるんだろうな〜という話をしていて、実際そうなったのである程度読みは正しかったのかなと思いつつ。</p>
<p><a href="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot.png"><br />
<img loading="lazy" class="aligncenter size-large wp-image-1676" src="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-640x259.png" alt="" width="620" height="251" srcset="https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-640x259.png 640w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-200x81.png 200w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-320x129.png 320w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot-768x311.png 768w, https://blog.monora.me/wp-content/uploads/2017/10/isucon7_best_shot.png 1968w" sizes="(max-width: 620px) 100vw, 620px" /></a></p>
<h2>総括/最高</h2>
<p>監視に強い人(@h-otter)強い。常に横で IOバウンドかネットワークバウンドか、みたいなことを見ながらアドバイスしてもらえる環境は最高。</p>
<p>限られた時間の大会という環境でもくもくとコードいじれる人(@hogas)強い。とにかく僕が頭が回ってなくてコードをまともに書けない状況にあったので、そんな中でちゃんと改善する変更を入れ続けてくれて最高。</p>
<p>基本的にどこに手を入れればいいか、この変更はコスパ的にどうかみたいなことを常に考えながら立ち振る舞えてはいたと思うので、そういった点ではなかなか善戦はできたかなと思いつつ。<br />
しかし、できたことは山のように残っているなという感想。、途中で集中力が切れてしまったこともあり、こういう結果になったのは悔しいなと思う。</p>
<p>ただ、これだけ言えるというのはつまりバランスが最高だということに他ならなくて、こういった駆け引きができるバランスのゲームを作るのはとにかく難しいなと思っているだけに最高だな！！！という気持ちです。<br />
こんな最高のコンテストを生み出してくれた運営の皆様、ありがとうございました。そしてお疲れ様でした！</p>
<p>本選に行かれる皆様はぜひとも頑張ってほしいなと思うところです。</p>
<p>&nbsp;</p>
<p>次回は最高の♨️から最高の心構えでやっていきたい。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>The post <a href="https://blog.monora.me/2017/10/participated-isucon7-qual/">ISUCON7 予選に参加しました</a> first appeared on <a href="https://blog.monora.me">monolog</a>.]]></content:encoded>
					
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1665</post-id>	</item>
	</channel>
</rss>
