Hi Waleed, This is likely related to this bug: http://code.google.com/p/googleappengine/issues/detail?id=6323
Though I'm a bit surprised that it is impacting you this much since you don't seem to be using much CPU. Cheers, Brian On Tue, Nov 22, 2011 at 8:29 AM, Waleed Abdulla <wal...@ninua.com> wrote: > Bump! > Nick, I sent the info you requested. > I'm still trying to find an explanation for why using multithreading > increased my response time by 10X. Any ideas? > Waleed > > > On Tue, Nov 15, 2011 at 7:00 PM, Waleed Abdulla <wal...@ninua.com> wrote: >> >> Hi Nick, >> Here are more details, and I'm attaching AppStats screen shots. >> - Along with the switch to Python 2.7, we also switched to NDB, and we >> removed our use of memcache in favor of the built-in caching in NDB. So when >> we noticed the delays, the first thing we suspected was that NDB caching >> wasn't working, so we re-implemented our use of memcache. That didn't help. >> - We checked if there are "pending_ms" values in the logs. There weren't >> any. >> - The instance and latency in "Application Settings" are all set to >> "automatic". >> - To keep things simple, we tested with one of the simple requests (it >> fetches a Blob from memcache and serves it as an image, then updates values >> in memcache). That request takes 1s to 3s when threadsafe is True, and >> 100-300ms when threadsafe is False. >> - I just enabled appstats after your email and collected data for both >> cases. Most of the delay seems to be happening in RPC calls. For example, >> memcache calls seem to take 200ms+. I'm attaching a couple of screen shots >> for a simple request when threadsafe is True and False. >> Hope this helps. >> Waleed >> >> >> >> On Tue, Nov 15, 2011 at 4:49 PM, Nick Johnson <nickjohn...@google.com> >> wrote: >>> >>> Hi Waleed, >>> It's impossible to say what the cause of the latency might be without >>> more details. You say you spent a lot of time investigating it; can you show >>> us some of the data you gathered? Did you use appstats? >>> -Nick Johnson >>> >>> On Wed, Nov 16, 2011 at 11:37 AM, Waleed Abdulla <wal...@ninua.com> >>> wrote: >>>> >>>> I just switched one of my apps to Python 2.7 and the average latency >>>> went up from 125ms to about 1.3 seconds (about 10x). My app is 'not' >>>> CPU-bound. It has a mix of different use patterns (some requests use >>>> urlfetch, others load data from datastore or memcache). That variety should >>>> make it a good candidate to benefit from multi-threading, but that doesn't >>>> seem to be working as expected. While the number of instances went down >>>> from >>>> 9 instances to 6, the 10X increase in latency is not acceptable. >>>> I spent a lot of time investigating it, and finally changed threadsafe >>>> to false and that fixed the problem (and, of course, raised my instance >>>> count to it's original level). Like the original poster, I was hoping that >>>> multithreading will reduce my instance cost, but that plan failed. >>>> Am I doing something wrong? Or is multi-threading not ready for live >>>> traffic yet? >>>> Waleed >>>> app id: bitpixelshr >>>> >>>> >>>> >>>> >>>> On Tue, Nov 15, 2011 at 3:10 AM, Jeff Schnitzer <j...@infohazard.org> >>>> wrote: >>>>> >>>>> Dunno about the Python library, but the standard Java jBCrypt library >>>>> uses a random salt per-user by default. >>>>> I'm also very suspicious of this idea that the attacker doesn't have >>>>> the source code. Python is trivially easy to decompile. Also, where do >>>>> you >>>>> keep your source code? In Github? Opens up a whole new set of attack >>>>> vectors, including disgruntled Github employees. >>>>> >>>>> Jeff >>>>> On Mon, Nov 14, 2011 at 10:52 PM, Brandon Wirtz <drak...@digerat.com> >>>>> wrote: >>>>>> >>>>>> Nick, >>>>>> >>>>>> >>>>>> >>>>>> I agree, that my threat model assumes they didn’t get my source code. >>>>>> That “Somebody else’s problem” works under the assumption people are >>>>>> going >>>>>> to get my data, not my source code because I don’t ever write my own DB >>>>>> server code I am stuck using someone else’s which means the vulnerability >>>>>> that I am most likely to face is that somebody else’s screw up will be >>>>>> where >>>>>> my problem lies. >>>>>> >>>>>> >>>>>> >>>>>> Granted this is a better strategy if you are running compiled code, >>>>>> since my code lives on the Google Server I’m at the mercy of Google’s >>>>>> Security, where as if I were running compiled code it would be less >>>>>> likely >>>>>> someone would get the code. >>>>>> >>>>>> >>>>>> >>>>>> I would say that unique salt per user, is a good thing. The most >>>>>> common way to attack a large password database is to look at the most >>>>>> common >>>>>> entries and compare against the most common passwords from other sources. >>>>>> If you know the 15 most used passwords and the 15 most often occurring >>>>>> database results you are a long ways towards knowing what those 15 values >>>>>> are and calculating the salt. You aren’t crunching millions of >>>>>> combinations >>>>>> you are crunching 1000’s and once you have the salt, you take your >>>>>> already >>>>>> deciphered list of the most common passwords and you calculate the top 5k >>>>>> using bcrypt and you now have about 50% of the data in fewer than 10k >>>>>> operations. >>>>>> >>>>>> >>>>>> >>>>>> Compare that with my scenario. You have data. You don’t have the >>>>>> source code. The UserID or other “spoiler” is in every salt so the >>>>>> reoccurrence of a hash doesn’t correspond to a duplicate password, and >>>>>> now >>>>>> the computation is nearly impossible even if you have the source code, >>>>>> because you have to calculate every value for every user anyway. >>>>>> >>>>>> >>>>>> >>>>>> Would Brcypt(Pass+UserID+Salt) be the best? Yes. But >>>>>> MD5(Pass+UserID+Salt) is going to still going to be orders of magnitude >>>>>> more >>>>>> difficult than Bcrypt(Pass+salt), because I can’t use knowledge of >>>>>> frequency >>>>>> tables to predict likely outcomes or detect duplicate passwords. >>>>>> >>>>>> >>>>>> >>>>>> -Brandon >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> From: google-appengine@googlegroups.com >>>>>> [mailto:google-appengine@googlegroups.com] On Behalf Of Nick Johnson >>>>>> Sent: Monday, November 14, 2011 6:21 PM >>>>>> >>>>>> To: google-appengine@googlegroups.com >>>>>> Subject: Re: [google-appengine] Help resolve massive performance >>>>>> regression in 2.7 vs 2.5 runtime >>>>>> >>>>>> >>>>>> >>>>>> Hi Brandon, >>>>>> >>>>>> >>>>>> >>>>>> What you say is fine if your threat model only includes "script >>>>>> kiddies" who don't have your source code. If either of those is not true >>>>>> - >>>>>> you have an adversary with some level of independent skill, or your >>>>>> source >>>>>> code is compromised - any method that relies on obscurity for its >>>>>> security >>>>>> will fare very poorly. >>>>>> >>>>>> >>>>>> >>>>>> One thing to bear in mind is that if your app is ever compromised, >>>>>> your password database and/or source may be posted publicly; at that >>>>>> point, >>>>>> you no longer have to worry about just the initial attacker, but anyone >>>>>> with >>>>>> sufficient motivation. >>>>>> >>>>>> >>>>>> >>>>>> Of course, using federated login like OpenID or the Users API obviates >>>>>> the need to store passwords at all, making it Someone Else's Problem. :) >>>>>> >>>>>> >>>>>> >>>>>> -Nick >>>>>> >>>>>> On Tue, Nov 15, 2011 at 1:07 PM, Brandon Wirtz <drak...@digerat.com> >>>>>> wrote: >>>>>> >>>>>> If I know your salt, I can “De-Hash” bcrypts faster than I can any of >>>>>> the “weird” combinations. Because there are libraries for doing so on ATI >>>>>> cards. >>>>>> >>>>>> >>>>>> >>>>>> If you do something weird a script kiddie can’t just pull code off the >>>>>> web and attack it. >>>>>> >>>>>> >>>>>> >>>>>> You want to see who can offline crack a set of 1M users? Your bcrypt >>>>>> list vs my “Weird” You don’t even have to give me the salt I’ll have >>>>>> 10k >>>>>> of those cracked in the first 72 hours. 10 to 1 odds you won’t get >>>>>> through >>>>>> mine without my source code in my life time. >>>>>> >>>>>> >>>>>> >>>>>> -Brandon Wirtz >>>>>> >>>>>> >>>>>> >>>>>> PS >>>>>> I don’t usually do the “trust me I’m far more evil” but FBI, Homeland >>>>>> Security, and the CIA have been to my doorstep for things I have >>>>>> defeated, >>>>>> documented, or built to keep from being defeated. The first time I was >>>>>> in >>>>>> 3rd grade. >>>>>> >>>>>> >>>>>> >>>>>> From: google-appengine@googlegroups.com >>>>>> [mailto:google-appengine@googlegroups.com] On Behalf Of Nick Johnson >>>>>> Sent: Monday, November 14, 2011 3:56 PM >>>>>> >>>>>> To: google-appengine@googlegroups.com >>>>>> Subject: Re: [google-appengine] Help resolve massive performance >>>>>> regression in 2.7 vs 2.5 runtime >>>>>> >>>>>> >>>>>> >>>>>> No! Please, please don't do this. Obscurity is no substitute for >>>>>> security. >>>>>> >>>>>> >>>>>> >>>>>> 1) Bcrypt or similar is not 'overkill' no matter who you are. Users >>>>>> reuse passwords, and they're entitled to the best protection you can >>>>>> reasonably provide them. >>>>>> >>>>>> 2) Bcrypt is not there to protect against online attacks, it's there >>>>>> to protect against offline attacks, where an attacker obtains your hashed >>>>>> and salted passwords. >>>>>> >>>>>> 3) Doing "something weird" is security through obscurity. Do not base >>>>>> your security on your attacker not knowing what you did. Really, really >>>>>> don't just concatenate salts to the beginning or end of the password. >>>>>> >>>>>> 4) Both MD5 and SHA1 are merkle-damgard construction hashes >>>>>> (http://en.wikipedia.org/wiki/Merkle%E2%80%93Damg%C3%A5rd_construction). >>>>>> As >>>>>> a result, the concatenation of several hashes is no more secure than the >>>>>> most secure of the individual hashes. >>>>>> >>>>>> >>>>>> >>>>>> -Nick Johnson >>>>>> >>>>>> >>>>>> >>>>>> On Sun, Nov 13, 2011 at 2:58 PM, Brandon Wirtz <drak...@digerat.com> >>>>>> wrote: >>>>>> >>>>>> Unless you are protecting Medical records bcrypt is overkill if you do >>>>>> some >>>>>> reasonably smart things like "Failed logins from IP >9" >>>>>> >>>>>> Or, if you just do something weird to the password BEFORE you SHA it. >>>>>> Like >>>>>> interleave the user name in the password, Salt1 + UpSaEsRsNwAoMrEd + >>>>>> Salt2 >>>>>> >>>>>> Or Pick 2 Hash's SHA(pass) + Md5(pass) >>>>>> >>>>>> Don't want to store all that string length? Odd Characters from >>>>>> Sha(Pass+salt) + Even Characters from MD5(Pass+Salt) >>>>>> >>>>>> Uniqueness of the method is more important than the method. >>>>>> >>>>>> >>>>>> >>>>>> -----Original Message----- >>>>>> From: google-appengine@googlegroups.com >>>>>> [mailto:google-appengine@googlegroups.com] On Behalf Of Brian Quinlan >>>>>> Sent: Saturday, November 12, 2011 6:58 PM >>>>>> To: google-appengine@googlegroups.com >>>>>> Subject: Re: [google-appengine] Help resolve massive performance >>>>>> regression >>>>>> in 2.7 vs 2.5 runtime >>>>>> >>>>>> Hi Pol, >>>>>> >>>>>> On Sun, Nov 13, 2011 at 1:48 PM, Pol <p...@everpix.net> wrote: >>>>>> > Hi, >>>>>> > >>>>>> > Since switching to 2.7 runtime, logging in to http://www.everpix.com >>>>>> > went from about a second to anywhere from 15s to 60s. I tracked it >>>>>> > down to this single password checking line: >>>>>> > >>>>>> > from bcrypt import bcrypt >>>>>> > bcrypt.hashpw(password, self.password_hash) == self.password_hash >>>>>> >>>>>> What value are you using for "threadsafe" in your app.yaml? >>>>>> >>>>>> How large is self.password_hash? >>>>>> >>>>>> Cheers, >>>>>> Brian >>>>>> >>>>>> > This comes from "a native Python implementation of the py-bcrypt >>>>>> > package from http://www.mindrot.org/projects/py-bcrypt/" grabbed >>>>>> > from >>>>>> > here: https://github.com/erlichmen/py-bcrypt. >>>>>> > >>>>>> > So what's happening here and how can we fix this? >>>>>> > >>>>>> > Thanks, >>>>>> > >>>>>> > - Pol >>>>>> > >>>>>> > -- >>>>>> > You received this message because you are subscribed to the Google >>>>>> > Groups >>>>>> "Google App Engine" group. >>>>>> > 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. >>>>>> > >>>>>> > >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups >>>>>> "Google App Engine" group. >>>>>> 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. >>>>>> >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Google App Engine" group. >>>>>> 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. >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Nick Johnson, Developer Programs Engineer, App Engine >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Google App Engine" group. >>>>>> 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. >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Google App Engine" group. >>>>>> 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. >>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Nick Johnson, Developer Programs Engineer, App Engine >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Google App Engine" group. >>>>>> 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. >>>>>> >>>>>> -- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "Google App Engine" group. >>>>>> 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. >>>>> >>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "Google App Engine" group. >>>>> 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. >>>> >>>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "Google App Engine" group. >>>> 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. >>> >>> >>> >>> -- >>> Nick Johnson, Developer Programs Engineer, App Engine >>> >>> >>> -- >>> You received this message because you are subscribed to the Google Groups >>> "Google App Engine" group. >>> 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. >> > > -- You received this message because you are subscribed to the Google Groups "Google App Engine" group. 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.