I've been working for some time on an app I plan to deploy.  Over the 
development period I have done testing on the QA instance of my app (which 
is a separate app ID from the one I'll use in production) but have not paid 
serious attention to performance since the functionality wasn't yet 
complete.

This past weekend I did some light real-world type testing, and the 
performance was terrible.  With QPS in the 5-10 range I was seeing 
latencies in the range of 10-20s.  Obviously, the first place I looked was 
my own code, but after some easy optimizations I got my query handling down 
to the 200ms range, and the response times on the client were still usually 
very bad (1s minimum, up to 10-20s max).  (Pings from the client to the 
appspot.com domain are pretty stable at 30ms.)

Looking further, I discovered that Google App Engine is spawning new 
instances of my app at a pathological rate.  For example, I left the app 
stats console open for a while, and found that just loading the appstats 
URI by itself would cause a new instance to spawn!  This is with zero QPS 
otherwise - my app was completely idle, and none of my own code was running 
at all.

I tried adjusting the min and max instance settings, but GAE seems to 
ignore them, as far as I can tell; the max is not honored, and although it 
does keep instances running to accommodate the min, those running instances 
don't prevent new ones from spawning.  It's as if GAE doesn't think they 
really exist. I also have the min latency set to the max of 15.0s, which is 
far beyond the rise time I'm seeing for GAE spawning new instances. 

Here's a set of logs taken from a very light load on the server, with a 2/2 
instance max/min setting.  I include logs from a previous slice of time so 
that you can see the /appstats URI also spawning new instances, but I want 
to emphasize that this is a continuous set of logs - there are no requests 
in this time window that aren't listed below.  I also include a screenshot 
of the instance panel in the console so you can see that the instances are, 
in fact, being created.

2012-07-31 18:58:12.541 /_ah/channel/connected/ 200 101ms 0kb
2012-07-31 18:58:10.894 /api/chat/G:1286432802 200 132ms 0kb Mozilla/5.0 
(iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B206
2012-07-31 18:58:09.809 /_ah/channel/connected/ 200 1076ms 0kb
2012-07-31 18:58:09.107 /api/game/72001/users 200 12312ms 0kb Mozilla/5.0 
(iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B206
2012-07-31 18:58:07.725 /api/chat/G:658732847 200 7232ms 0kb Mozilla/5.0 
(iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B176
2012-07-31 18:58:00.279 /api/game/72001/users 200 8820ms 0kb Mozilla/5.0 
(iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B176
I 2012-07-31 18:58:00.279 This request caused a new process to be started 
for your application, and thus caused your application code to be loaded 
for the first time. This requ
2012-07-31 18:57:56.393 /api/game/72001 200 6044ms 3kb Mozilla/5.0 (iPad; 
CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B206
2012-07-31 18:57:55.920 /_ah/warmup 200 5105ms 0kb
I 2012-07-31 18:57:55.916 This request caused a new process to be started 
for your application, and thus caused your application code to be loaded 
for the first time. This requ
2012-07-31 18:57:51.324 /api/game/72001 200 7151ms 3kb Mozilla/5.0 (iPad; 
CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) 
Mobile/9B176
2012-07-31 18:57:49.779 /_ah/warmup 200 4629ms 0kb
I 2012-07-31 18:57:49.778 This request caused a new process to be started 
for your application, and thus caused your application code to be loaded 
for the first time. This requ
2012-07-31 18:57:01.504 /_ah/warmup 200 5225ms 0kb
I 2012-07-31 18:57:01.503 This request caused a new process to be started 
for your application, and thus caused your application code to be loaded 
for the first time. This requ
2012-07-31 18:13:56.599 /_ah/warmup 200 4784ms 0kb
I 2012-07-31 18:13:56.581 This request caused a new process to be started 
for your application, and thus caused your application code to be loaded 
for the first time. This requ
2012-07-31 18:06:53.651 /appstats/stats 200 898ms 285kb Mozilla/5.0 
(Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.25 (KHTML, like Gecko) 
Version/6.0 Safari/536.25
2012-07-31 18:06:52.618 /appstats 302 33ms 0kb Mozilla/5.0 (Macintosh; 
Intel Mac OS X 10_7_4) AppleWebKit/536.25 (KHTML, like Gecko) Version/6.0 
Safari/536.25
2012-07-31 18:06:14.538 /appstats/static/plus.gif 200 45ms 0kb Mozilla/5.0 
(Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.25 (KHTML, like Gecko) 
Version/6.0 Safari/536.25
2012-07-31 18:06:14.298 /appstats/static/app_engine_logo_sm.gif 200 4820ms 
3kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.25 
(KHTML, like Gecko) Version/6.0 Safari/536.25
2012-07-31 18:06:14.288 /appstats/static/appstats_js.js 200 4699ms 43kb 
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.25 (KHTML, 
like Gecko) Version/6.0 Safari/536.25
I 2012-07-31 18:06:14.288 This request caused a new process to be started 
for your application, and thus caused your application code to be loaded 
for the first time. This requ

Can anyone explain why this might be happening?  I don't understand why 
this isn't clobbering everyone that uses GAE.  With such aggressive 
instancing, the performance just completely falls apart.

If I can't solve this, I am faced with backing away from GAE entirely, 
ripping out all the API dependencies and hosting the code on my own Tomcat 
server somewhere.  I don't really want to do that because I don't want to 
be in the business of server maintenance - that's one of the key reasons I 
went with GAE in the first place - but I can't ship a product with this 
behavior.

Thanks,

- Kris

<https://lh5.googleusercontent.com/-496R6CB81VU/UBiRpt8impI/AAAAAAAAAC4/vX0OnFt3KiM/s1600/Instances.png>

-- 
You received this message because you are subscribed to the Google Groups 
"Google App Engine" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-appengine/-/qErJJOQ63KYJ.
To post to this group, send email to google-appengine@googlegroups.com.
To unsubscribe from this group, send email to 
google-appengine+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-appengine?hl=en.

Reply via email to