Skip to content

[webapp/perl] initial implementation - #117

Merged
progfay merged 32 commits into
masterfrom
webapp-perl
Sep 10, 2020
Merged

[webapp/perl] initial implementation#117
progfay merged 32 commits into
masterfrom
webapp-perl

Conversation

@kfly8

@kfly8 kfly8 commented Aug 30, 2020

Copy link
Copy Markdown
Contributor

目的

  • Perlの参考実装をすること

解決方法

  • webapp/go を Perl で書き直す

動作確認

  • ベンチマークを通す
    • ./bench -data-dir ../initial-data -fixture-dir ../webapp/fixture -target-url http://127.0.0.1:8080/
  • 負荷レベルを上げる、ベンチのパラメタを変えてもベンチが通ることを確認する
    • この辺 をいじって、ベンチをかけてみる
  • 目でおおよそ確認する
    • Go実装と比較してみる
    • フロントエンドをかまして動作する

やらないこと(別のp-rで実施する想定だが、状況次第でこのp-rで実施)

参考文献 (Optional)

@kfly8 kfly8 self-assigned this Aug 30, 2020
@kfly8

kfly8 commented Sep 7, 2020

Copy link
Copy Markdown
Contributor Author

ベンチマークは複数回実施して、通ることを確認した

2020/09/07 11:49:43 bench.go:89: === initialize ===
2020/09/07 11:49:49 bench.go:107: === verify ===
2020/09/07 11:49:49 bench.go:125: === validation ===
2020/09/07 11:50:49 bench.go:132: 最終的な負荷レベル: 0
2020/09/07 11:50:49 bench.go:155: 246 0
{"pass":true,"score":246,"messages":[],"language":"perl"}
2020/09/07 11:51:41 bench.go:89: === initialize ===
2020/09/07 11:51:46 bench.go:107: === verify ===
2020/09/07 11:51:46 bench.go:125: === validation ===
2020/09/07 11:52:46 bench.go:132: 最終的な負荷レベル: 0
2020/09/07 11:52:46 bench.go:155: 254 0
{"pass":true,"score":254,"messages":[],"language":"perl"}
2020/09/07 11:53:48 bench.go:89: === initialize ===
2020/09/07 11:53:52 bench.go:107: === verify ===
2020/09/07 11:53:52 bench.go:125: === validation ===
2020/09/07 11:54:52 bench.go:132: 最終的な負荷レベル: 0
2020/09/07 11:54:52 bench.go:155: 262 0
{"pass":true,"score":262,"messages":[],"language":"perl"}

@kfly8 kfly8 changed the title [WIP] [webapp/perl] initial implementation [webapp/perl] initial implementation Sep 7, 2020
@kfly8

kfly8 commented Sep 7, 2020

Copy link
Copy Markdown
Contributor Author

インフラチームへの報告事項

1. perlのビルドオプションに uselongdouble を指定すること【報告済み

uselongdouble は、拡張倍精度浮動小数点を扱うためのビルドオプション
ビルドオプションが正しく設定されたかどうか確認する方法は、perl -V:nvsize で16となれば良い。デフォルトだと8。

理由
緯度経度が、情報落ちしてしまう為。
例えば、緯度:34.560727610897644は、緯度:34.5607276108976 のように情報落ちする。

他の選択肢は無かったのか?
任意桁を扱うモジュール(Math::BigFloatなど)はあるが、

  1. 本質的な内容以外のコードが増える
  2. 性能劣化する
    ため、isucon利用ではデメリットが大きいと考えた。

補足:uselongdouble利用のデメリット

  • 競技者の利用モジュールのモジュールテストこけるかも?

    • 対応
      • 利用想定のモジュールを試してみる
      • モジュールインストール時のテストをしない(現状、インストール速度のため、すでにno-testになっている)
  • 慣れないオプションでギョッとするかも?

    • 対応無し。しょうがない。BigFloatのコードが散りばめられる方が罠っぽい。のでそれに比べれば。

Comment thread webapp/perl/lib/Isuumo/Web.pm Outdated
Comment thread webapp/perl/lib/Isuumo/Web.pm Outdated
Comment thread webapp/perl/lib/Isuumo/Web.pm Outdated
@yosuke-furukawa

Copy link
Copy Markdown
Collaborator

いくつか指摘しました。 @progfay この上でベンチマークが通ってたら教えて下さい。直ったらマージしちゃいます。

デフォルトのperlだと、
例えば、緯度:34.560727610897644は、緯度:34.5607276108976 のように情報落ちする

perlのビルドオプションを変更せずに、
Math::BigFloatなど不動小数点の精度を変更できるモジュール利用も検討した。
しかし、
1. 本質的な内容以外のコードが増える
2. 性能劣化する
ため、isucon利用ではデメリットが大きいと考えた。
@progfay

progfay commented Sep 10, 2020

Copy link
Copy Markdown
Member

1回目

2020/09/10 13:09:36: === initialize ===
2020/09/10 13:09:40: === verify ===
2020/09/10 13:09:41: === validation ===
2020/09/10 13:10:25: 負荷レベルが上昇しました。
2020/09/10 13:10:41: 最終的な負荷レベル: 1
{"pass":true,"score":413,"messages":[],"language":"perl"}

2回目

2020/09/10 13:17:01: === initialize ===
2020/09/10 13:17:05: === verify ===
2020/09/10 13:17:06: === validation ===
2020/09/10 13:17:48: 負荷レベルが上昇しました。
2020/09/10 13:18:06: 最終的な負荷レベル: 1
{"pass":true,"score":426,"messages":[],"language":"perl"}

3回目

2020/09/10 13:19:58: === initialize ===
2020/09/10 13:20:02: === verify ===
2020/09/10 13:20:03: === validation ===
2020/09/10 13:20:47: 負荷レベルが上昇しました。
2020/09/10 13:21:03: 最終的な負荷レベル: 1
{"pass":true,"score":416,"messages":[],"language":"perl"}

MySQL Slow Query

Query 0
9.546700%

Summary:
total query time:       40.84s
total query count:      341

+--------------+-------------+-------+----------+----------+----------+---------+----------+
| ATTRIBUTE    |       TOTAL |   MIN |      MAX |      AVG |      95% |  STDDEV |   MEDIAN |
+--------------+-------------+-------+----------+----------+----------+---------+----------+
| Exec Time    |         41s | 474us |    735ms |    120ms |    164ms |    71ms |    109ms |
| Lock Time    |        15ms |   0us |      1ms |     44us |     73us |    62us |     36us |
| Rows Sent    |     6780.00 |  0.00 |    20.00 |    19.94 |    20.00 |    1.53 |    20.00 |
| Rows Examine | 10176280.00 |  0.00 | 30020.00 | 29930.24 | 30020.00 | 2295.71 | 30020.00 |
+--------------+-------------+-------+----------+----------+----------+---------+----------+

Query_time distribution:
  1us:  
 10us:  
100us:  
  1ms:  
 10ms:  ##########################################
100ms:  ###########################################################################
   1s:  
 10s~:  

QueryExample:
SELECT /* /home/isucon/isuumo/webapp/perl/lib/Isuumo/Web.pm line 457 */ * FROM chair WHERE stock > 0 ORDER BY price ASC, id ASC LIMIT 20;


Query 1
7.726401%

Summary:
total query time:       33.05s
total query count:      341

+--------------+-------------+------+----------+----------+----------+---------+----------+
| ATTRIBUTE    |       TOTAL |  MIN |      MAX |      AVG |      95% |  STDDEV |   MEDIAN |
+--------------+-------------+------+----------+----------+----------+---------+----------+
| Exec Time    |         33s |  3ms |    175ms |     97ms |    143ms |    24ms |     94ms |
| Lock Time    |        19ms |  0us |      4ms |     55us |     73us |   224us |     36us |
| Rows Sent    |     6800.00 | 0.00 |    20.00 |    20.00 |    20.00 |    1.08 |    20.00 |
| Rows Examine | 10206300.00 | 0.00 | 30020.00 | 30018.53 | 30020.00 | 1625.82 | 30020.00 |
+--------------+-------------+------+----------+----------+----------+---------+----------+

Query_time distribution:
  1us:  
 10us:  
100us:  
  1ms:  
 10ms:  ###########################################################################
100ms:  ############################################
   1s:  
 10s~:  

QueryExample:
SELECT /* /home/isucon/isuumo/webapp/perl/lib/Isuumo/Web.pm line 664 */ * FROM estate ORDER BY rent ASC, id ASC LIMIT 20;


Query 2
7.091287%

Summary:
total query time:       30.34s
total query count:      289

+--------------+------------+------+----------+----------+----------+---------+----------+
| ATTRIBUTE    |      TOTAL |  MIN |      MAX |      AVG |      95% |  STDDEV |   MEDIAN |
+--------------+------------+------+----------+----------+----------+---------+----------+
| Exec Time    |        30s |  7ms |    196ms |    105ms |    149ms |    23ms |    104ms |
| Lock Time    |       15ms |  0us |      1ms |     52us |     88us |    75us |     42us |
| Rows Sent    |    7200.00 | 0.00 |    25.00 |    25.00 |    25.00 |    1.47 |    25.00 |
| Rows Examine | 8657150.00 | 0.00 | 30125.00 | 30059.55 | 30125.00 | 1768.59 | 30050.00 |
+--------------+------------+------+----------+----------+----------+---------+----------+

Query_time distribution:
  1us:  
 10us:  
100us:  
  1ms:  
 10ms:  #######################################################
100ms:  ###########################################################################
   1s:  
 10s~:  

QueryExample:
SELECT /* /home/isucon/isuumo/webapp/perl/lib/Isuumo/Web.pm line 638 */ * FROM estate WHERE rent >= '100000' AND rent < '150000' ORDER BY popularity DESC, id ASC LIMIT 25 OFFSET 0;

@progfay progfay left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@progfay
progfay merged commit 41f1b3d into master Sep 10, 2020
@progfay
progfay deleted the webapp-perl branch September 10, 2020 13:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants