Turned on the slow query log, doesn't seem to be that. The fact that it isn't consistently bad for similar hits, and also seems to need some load to be exposed makes me thing either some contention while inside the request in Python, including lazy loads. I have been able to get some timings on a somewhat (but not hugely) slow hit on one of the specific routes while running the Flask app in standalone debug mode, and it seems to indicate that the time is being taken inside Python, no problem with a lack of Apache or WSGI threads causing the delay, and before doing any rendering of the HTML template for return. It certainly seems to be related to DB stuff, rather than any CPU/Python issues.
I'm willing to believe that this is something that was present in our old MySQL 5.5 setup at a lower frequency or shorter delays, but I'm not sure what in the new setup would have caused a sudden exacerbation of the problem. The old 5.5 MySQL had a query cache of either 8M or 16M, the new 5.7 MySQL started with a 64M query_cache. I've now disabled the query_cache, and while overall performance seems a little better, the odd spikes are still there. All tables of interest should be InnoDB, and there's a 2GB innodb_buffer_pool_size, which should be well in excess of actual data. The specific request route I've been trying to look at should only be doing reads, no writes or updates, and I wouldn't think any of the little one-to-one relationships lazyloads it might indirectly trigger would be locked by a different thread, certainly not for appreciable time. I'm going to try debugging with the pools "timeout" set to a very low value (it defaults to 30 seconds) to see if it ever hits max_overflow and fails to instantly get a connection when needed, but out WSGI processes have 10 threads and the pool shouldn't hit this until 5+10=15 connections are active, and unless I'm missing something I should not be using more than one connection per thread - this was why I was checking for a built-in high-water counter for pool connections. I'll keep checking my understanding of MySQL and SQLAlchemy for anything that could be holding a row locked that I'm not realizing, or something similar. SQLAlchemy isn't throwing any exceptions related to deadlocks, connections exhaused, etc, as these would bubble up and abort the Flask request. On Friday, September 1, 2017 at 4:51:08 PM UTC-3, Jonathan Vanasco wrote: > > what do your database and server logs show? are there slow query > timeouts, deadlocks, etc? are these happening during peak load? 10-30 > seconds looks more like an issue with competing locks or available workers, > than potentially pool checkouts or lazy loading. > > aside from db logs, i've found statsd very useful for debugging these > sorts of things. we log both requests count/timing and hundreds of points > in our codebase as well. > -- SQLAlchemy - The Python SQL Toolkit and Object Relational Mapper http://www.sqlalchemy.org/ To post example code, please provide an MCVE: Minimal, Complete, and Verifiable Example. See http://stackoverflow.com/help/mcve for a full description. --- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sqlalchemy+unsubscr...@googlegroups.com. To post to this group, send email to sqlalchemy@googlegroups.com. Visit this group at https://groups.google.com/group/sqlalchemy. For more options, visit https://groups.google.com/d/optout.