When it’s ready.

出来るまで出来ない

エロティックHadoopにつられる前に、GAEのputスピードはかってみた。

GAEの動作が意外に遅い。もっとぱぱっと保存なり、処理が終わると思いきや意外と数秒、時には20秒とかかかる。
EC2使えばもっと快適に出来るそうだよとか、そんな声も聞こえるが、Deployの簡単さやIOの拡大がノーコンフィグだったりするところは大変魅力なのでGAEも簡単にはあきらめられない。
そこで、実際に遅いとはどの程度遅いのか計ってみた。

文字と作成日時と更新日時とID的な数字があるだけのモデルをひたすらForで回し、一個ずつのputにかかる時間を計るだけのもの。保存する文字数と保存する個数をリクエストから引っ張ってくる。

感想

保存するモノがGQL的なモノを使わずソートなども行っていない、全くの新規というのが効いたのか、言うほど遅くないなぁという感じ。ばらつきはあるが、遅くても300msくらいで保存できてる。また、保存するテキストの量を1文字、10文字、100文字、1000文字にしても、putにかかる時間が変わらないので1000文字程度ではそれほど、大きな負荷ではないようだ。GAEの30秒の壁が、250以上300個未満の所にあったので、120msくらいが平均であろう。これに、ソートだったりフィルタが絡むとどれくらい遅くなるのか、引き続き調べていきたい。一回のリクエストで200個もエンティティーをアップデートする必要があるアプリというが発想的におかしい気がするが、バイグラムやったら200個でも全然足りないくらい。
 その結果、どうしても越えられない壁が出来たらEC2に行ってみようと思う。

モデル

class t_Feed(db.Model):                                                                                      
  feed_id = db.IntegerProperty()
  text = db.TextProperty(required=True)
  created = db.DateTimeProperty(auto_now_add=True)
  updated = db.DateTimeProperty(auto_now=True)

View

class t_update(webapp.RequestHandler):
   import random
   from datetime import datetime
   def post(self):
     str_length = int(self.request.get('str_length'))
     save_cnt = int(self.request.get('save_cnt'))
     atime = datetime.datetime.now()
     for i in range(save_cnt):
       last_feed_id = t_global_feed_counter()
       tmp_str = str(random.randint(10**str_length, 10**(str_length+1)-1))
       feed = t_Feed(text = '%s'%tmp_str, feed_id = last_feed_id)
       feed.put()
       deltatime = datetime.datetime.now() - atime
       self.response.out.write('%03d : %07d亮s<br>'%(i, deltatime.microseconds))                              
       atime = datetime.datetime.now()

結果(msと書いてあるが、単位はマイクロセカンド)

100文字を50回の場合

000 : 0115188ms
001 : 0119584ms
002 : 0098056ms
003 : 0087422ms
004 : 0091820ms
005 : 0129685ms
006 : 0085007ms
007 : 0157573ms
008 : 0079381ms
009 : 0139754ms
010 : 0114282ms
011 : 0118027ms
012 : 0106334ms
013 : 0072417ms
014 : 0113714ms
015 : 0084016ms
016 : 0205421ms
017 : 0122985ms
018 : 0094173ms
019 : 0060555ms
020 : 0075605ms
021 : 0097010ms
022 : 0101956ms
023 : 0072687ms
024 : 0068117ms
025 : 0112841ms
026 : 0212146ms
027 : 0116812ms
028 : 0088384ms
029 : 0074779ms
030 : 0092739ms
031 : 0079593ms
032 : 0129288ms
033 : 0115324ms
034 : 0097161ms
035 : 0105010ms
036 : 0102663ms
037 : 0098486ms
038 : 0081902ms
039 : 0072965ms
040 : 0087166ms
041 : 0065185ms
042 : 0057208ms
043 : 0104345ms
044 : 0114349ms
045 : 0092059ms
046 : 0527995ms
047 : 0065525ms
048 : 0096446ms
049 : 0127067ms

1000文字を10回の場合

000 : 0109894ms
001 : 0096034ms
002 : 0137897ms
003 : 0163081ms
004 : 0127023ms
005 : 0092036ms
006 : 0070201ms
007 : 0073222ms
008 : 0114803ms
009 : 0084697ms

1文字を10回の場合

000 : 0064131ms
001 : 0053088ms
002 : 0060691ms
003 : 0081393ms
004 : 0117559ms
005 : 0119811ms
006 : 0297526ms
007 : 0094630ms
008 : 0060647ms
009 : 0100541ms

90文字を200個の場合

000 : 0096623ms
001 : 0048280ms
002 : 0085528ms
003 : 0123406ms
004 : 0083318ms
005 : 0081927ms
006 : 0110975ms
007 : 0096108ms
008 : 0090142ms
009 : 0129356ms
010 : 0116885ms
011 : 0077915ms
012 : 0073036ms
013 : 0069138ms
014 : 0050098ms
015 : 0103342ms
016 : 0068514ms
017 : 0079184ms
018 : 0090852ms
019 : 0080927ms
020 : 0083450ms
021 : 0066114ms
022 : 0071676ms
023 : 0055522ms
024 : 0081748ms
025 : 0066872ms
026 : 0075948ms
027 : 0062006ms
028 : 0058373ms
029 : 0047025ms
030 : 0054758ms
031 : 0066787ms
032 : 0058876ms
033 : 0061230ms
034 : 0052376ms
035 : 0084052ms
036 : 0095846ms
037 : 0081454ms
038 : 0089157ms
039 : 0097729ms
040 : 0089981ms
041 : 0068219ms
042 : 0069369ms
043 : 0065246ms
044 : 0078459ms
045 : 0071075ms
046 : 0284049ms
047 : 0112070ms
048 : 0192335ms
049 : 0096990ms
050 : 0061803ms
051 : 0065631ms
052 : 0077915ms
053 : 0077608ms
054 : 0192110ms
055 : 0149910ms
056 : 0077082ms
057 : 0071808ms
058 : 0300850ms
059 : 0127819ms
060 : 0173263ms
061 : 0058470ms
062 : 0062355ms
063 : 0095634ms
064 : 0087579ms
065 : 0130964ms
066 : 0078487ms
067 : 0076663ms
068 : 0108342ms
069 : 0150830ms
070 : 0075925ms
071 : 0103543ms
072 : 0080024ms
073 : 0077508ms
074 : 0071739ms
075 : 0076136ms
076 : 0056552ms
077 : 0068863ms
078 : 0075166ms
079 : 0097065ms
080 : 0086584ms
081 : 0087686ms
082 : 0083391ms
083 : 0076979ms
084 : 0057651ms
085 : 0094625ms
086 : 0097736ms
087 : 0079077ms
088 : 0081076ms
089 : 0084382ms
090 : 0098525ms
091 : 0093436ms
092 : 0069644ms
093 : 0106737ms
094 : 0098622ms
095 : 0076708ms
096 : 0089367ms
097 : 0088262ms
098 : 0084735ms
099 : 0067892ms
100 : 0049911ms
101 : 0055552ms
102 : 0096692ms
103 : 0082174ms
104 : 0062389ms
105 : 0093527ms
106 : 0057381ms
107 : 0066634ms
108 : 0080344ms
109 : 0069386ms
110 : 0056468ms
111 : 0059327ms
112 : 0096182ms
113 : 0099951ms
114 : 0100261ms
115 : 0072312ms
116 : 0057827ms
117 : 0069874ms
118 : 0073249ms
119 : 0082163ms
120 : 0091214ms
121 : 0063691ms
122 : 0087531ms
123 : 0093647ms
124 : 0080422ms
125 : 0100783ms
126 : 0102391ms
127 : 0095454ms
128 : 0058289ms
129 : 0080423ms
130 : 0067186ms
131 : 0070520ms
132 : 0128873ms
133 : 0066114ms
134 : 0081517ms
135 : 0073058ms
136 : 0095604ms
137 : 0088779ms
138 : 0129034ms
139 : 0125385ms
140 : 0118654ms
141 : 0111045ms
142 : 0133521ms
143 : 0130024ms
144 : 0079604ms
145 : 0102726ms
146 : 0110848ms
147 : 0085616ms
148 : 0107356ms
149 : 0104963ms
150 : 0116709ms
151 : 0078064ms
152 : 0311696ms
153 : 0123751ms
154 : 0151699ms
155 : 0190892ms
156 : 0076212ms
157 : 0084139ms
158 : 0128939ms
159 : 0093456ms
160 : 0100677ms
161 : 0076520ms
162 : 0069834ms
163 : 0105702ms
164 : 0100687ms
165 : 0079175ms
166 : 0075217ms
167 : 0063811ms
168 : 0089973ms
169 : 0103638ms
170 : 0102076ms
171 : 0192142ms
172 : 0114991ms
173 : 0111613ms
174 : 0112005ms
175 : 0118902ms
176 : 0084141ms
177 : 0101081ms
178 : 0064882ms
179 : 0685661ms
180 : 0089130ms
181 : 0138929ms
182 : 0255145ms
183 : 0087069ms
184 : 0105296ms
185 : 0083319ms
186 : 0120810ms
187 : 0152564ms
188 : 0126085ms
189 : 0101027ms
190 : 0125034ms
191 : 0093277ms
192 : 0147425ms
193 : 0102436ms
194 : 0124511ms
195 : 0072780ms
196 : 0100400ms
197 : 0101953ms
198 : 0154324ms
199 : 0121170ms