So, is time for 25 concurrent requests significantly greater than 25*[time 
for a single request]?

On Monday, November 25, 2013 12:55:06 PM UTC-5, Saurabh Kumar wrote:
>
> Apparently not. Following are the logs when doing single request will all 
> 100 tables defined.
>
>   14877 function calls (14855 primitive calls) in 0.117 seconds
>
>    Ordered by: internal time, call count
>    List reduced from 220 to 50 due to restriction <50>
>
>    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
>         8    0.025    0.003    0.025    0.003 
> /home/www-data/lambda/gluon/restricted.py:190(compile2)
>       102    0.017    0.000    0.031    0.000 
> /home/www-data/lambda/gluon/dal.py:8025(__init__)
>       596    0.012    0.000    0.015    0.000 
> /home/www-data/lambda/gluon/dal.py:9100(__init__)
>      1726    0.006    0.000    0.006    0.000 
> /home/www-data/lambda/gluon/dal.py:8247(__getitem__)
>      2242    0.005    0.000    0.007    0.000 
> /home/www-data/lambda/gluon/dal.py:8317(__setattr__)
>       520    0.005    0.000    0.015    0.000 
> /home/www-data/lambda/gluon/dal.py:6620(sqlhtml_validators)
>       101    0.004    0.000    0.063    0.001 
> /home/www-data/lambda/gluon/dal.py:7658(lazy_define_table)
>      1392    0.004    0.000    0.007    0.000 
> /home/www-data/lambda/gluon/dal.py:8339(__iter__)
>         1    0.003    0.003    0.091    0.091 
> /home/www-data/lambda/applications/chat/models/db.py:1(<module>)
>       101    0.003    0.000    0.066    0.001 
> /home/www-data/lambda/gluon/dal.py:7628(define_table)
>       695    0.003    0.000    0.003    0.000 
> /home/www-data/lambda/gluon/dal.py:8288(__setitem__)
>       101    0.003    0.000    0.007    0.000 
> /home/www-data/lambda/gluon/dal.py:8198(_create_references)
>       596    0.002    0.000    0.002    0.000 
> /home/www-data/lambda/gluon/dal.py:5060(cleanup)
>       151    0.002    0.000    0.002    0.000 
> /home/www-data/lambda/gluon/custom_import.py:37(custom_importer)
>        89    0.002    0.000    0.003    0.000 
> /home/www-data/lambda/gluon/validators.py:450(__init__)
>       102    0.002    0.000    0.002    0.000 
> /home/www-data/lambda/gluon/dal.py:457(pluralize)
>       181    0.001    0.000    0.004    0.000 
> /home/www-data/lambda/gluon/languages.py:867(translate)
>       160    0.001    0.000    0.007    0.000 
> /home/www-data/lambda/gluon/validators.py:77(translate)
>        82    0.001    0.000    0.004    0.000 
> /home/www-data/lambda/gluon/validators.py:689(__init__)
>       184    0.001    0.000    0.001    0.000 
> /home/www-data/lambda/gluon/languages.py:338(__init__)
>       181    0.001    0.000    0.005    0.000 
> /home/www-data/lambda/gluon/languages.py:367(__str__)
>
> Also if you see closely, there might be some slow down due to locking. 
> Look at the following line taken from the log I had posted earlier.
>
>
>        16217 function calls (16199 primitive calls) in 1.558 seconds
>
>    Ordered by: internal time, call count
>    List reduced from 188 to 50 due to restriction <50>
>
>    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
>      1710    0.342    0.000    0.530    0.000 
> /home/www-data/lambda/gluon/dal.py:8247(__getitem__)
>        14    0.188    0.013    0.188    0.013 
> /usr/lib/python2.7/dist-packages/MySQLdb/cursors.py:97(nextset)
>       183    0.152    0.001    0.152    0.001 
> /usr/lib/python2.7/threading.py:146(acquire)
>       366    0.131    0.000    0.132    0.000 
> /usr/lib/python2.7/genericpath.py:38(isdir)
>       102    0.107    0.001    0.241    0.002 
> /home/www-data/lambda/gluon/dal.py:8025(__init__)
>       595    0.102    0.000    0.556    0.001 
> /home/www-data/lambda/gluon/dal.py:9100(__init__)
>      2242    0.086    0.000    0.100    0.000 
> /home/www-data/lambda/gluon/dal.py:8317(__setattr__)
>       596    0.055    0.000    0.055    0.000 
> /home/www-data/lambda/gluon/dal.py:5060(cleanup)
>       379    0.052    0.000    0.052    0.000 
> /usr/lib/python2.7/posixpath.py:68(join)
>         3    0.048    0.016    0.048    0.016 
> /usr/lib/python2.7/dist-packages/MySQLdb/cursors.py:277(_do_query)
>       101    0.038    0.000    0.681    0.007 
> /home/www-data/lambda/gluon/dal.py:7658(lazy_define_table)
>       101    0.036    0.000    0.073    0.001 
> /home/www-data/lambda/gluon/dal.py:8198(_create_references)
>       520    0.035    0.000    0.214    0.000 
> /home/www-data/lambda/gluon/dal.py:6620(sqlhtml_validators)
>       101    0.035    0.000    0.717    0.007 
> /home/www-data/lambda/gluon/dal.py:7628(define_table)
>         1    0.029    0.029    1.369    1.369 
> /home/www-data/lambda/applications/chat/compiled/models/db.py:1(<module>)
>       158    0.024    0.000    0.024    0.000 
> /home/www-data/lambda/gluon/validators.py:2564(__init__)
>      1384    0.015    0.000    0.138    0.000 
> /home/www-data/lambda/gluon/dal.py:8339(__iter__)
>       102    0.014    0.000    0.014    0.000 
> /home/www-data/lambda/gluon/dal.py:457(pluralize)
>       695    0.013    0.000    0.013    0.000 
> /home/www-data/lambda/gluon/dal.py:8288(__setitem__)
>       414    0.013    0.000    0.013    0.000 
> /home/www-data/lambda/gluon/dal.py:7762(__getattr__)
>        89    0.012    0.000    0.014    0.000 
> /home/www-data/lambda/gluon/validators.py:450(__init__)
>         6    0.005    0.001    0.005    0.001 
> /usr/lib/python2.7/socket.py:223(meth)
>
>
>
> On Monday, November 25, 2013 11:07:52 PM UTC+5:30, Anthony wrote:
>>
>> With 100 table definitions, even a single request will probably be 
>> relatively slow. You might want to see if you can conditionally define your 
>> tables depending on the controller/function called (you can set up 
>> conditional model files or move the definitions to modules that get 
>> imported and run when needed).
>>
>> Anthony
>>
>> On Monday, November 25, 2013 12:23:37 PM UTC-5, Saurabh Kumar wrote:
>>>
>>> The Web2py response slows down when faced with concurrent requests. On 
>>> doing some profiling, I found out that this occurs because DAL start 
>>> responding slowly. Here is the profile log, that confirms the same:
>>>
>>> root@replica:/home/www-data/lambda# python c.py  mod-20131125T164445.prof
>>>          16217 function calls (16199 primitive calls) in 1.558 seconds
>>>
>>>    Ordered by: internal time, call count
>>>    List reduced from 188 to 50 due to restriction <50>
>>>
>>>    ncalls  tottime  percall  cumtime  percall filename:lineno(function)
>>>      1710    0.342    0.000    0.530    0.000 
>>> /home/www-data/lambda/gluon/dal.py:8247(__getitem__)
>>>        14    0.188    0.013    0.188    0.013 
>>> /usr/lib/python2.7/dist-packages/MySQLdb/cursors.py:97(nextset)
>>>       183    0.152    0.001    0.152    0.001 
>>> /usr/lib/python2.7/threading.py:146(acquire)
>>>       366    0.131    0.000    0.132    0.000 
>>> /usr/lib/python2.7/genericpath.py:38(isdir)
>>>       102    0.107    0.001    0.241    0.002 
>>> /home/www-data/lambda/gluon/dal.py:8025(__init__)
>>>       595    0.102    0.000    0.556    0.001 
>>> /home/www-data/lambda/gluon/dal.py:9100(__init__)
>>>      2242    0.086    0.000    0.100    0.000 
>>> /home/www-data/lambda/gluon/dal.py:8317(__setattr__)
>>>       596    0.055    0.000    0.055    0.000 
>>> /home/www-data/lambda/gluon/dal.py:5060(cleanup)
>>>       379    0.052    0.000    0.052    0.000 
>>> /usr/lib/python2.7/posixpath.py:68(join)
>>>         3    0.048    0.016    0.048    0.016 
>>> /usr/lib/python2.7/dist-packages/MySQLdb/cursors.py:277(_do_query)
>>>       101    0.038    0.000    0.681    0.007 
>>> /home/www-data/lambda/gluon/dal.py:7658(lazy_define_table)
>>>       101    0.036    0.000    0.073    0.001 
>>> /home/www-data/lambda/gluon/dal.py:8198(_create_references)
>>>       520    0.035    0.000    0.214    0.000 
>>> /home/www-data/lambda/gluon/dal.py:6620(sqlhtml_validators)
>>>       101    0.035    0.000    0.717    0.007 
>>> /home/www-data/lambda/gluon/dal.py:7628(define_table)
>>>         1    0.029    0.029    1.369    1.369 
>>> /home/www-data/lambda/applications/chat/compiled/models/db.py:1(<module>)
>>>       158    0.024    0.000    0.024    0.000 
>>> /home/www-data/lambda/gluon/validators.py:2564(__init__)
>>>      1384    0.015    0.000    0.138    0.000 
>>> /home/www-data/lambda/gluon/dal.py:8339(__iter__)
>>>       102    0.014    0.000    0.014    0.000 
>>> /home/www-data/lambda/gluon/dal.py:457(pluralize)
>>>       695    0.013    0.000    0.013    0.000 
>>> /home/www-data/lambda/gluon/dal.py:8288(__setitem__)
>>>       414    0.013    0.000    0.013    0.000 
>>> /home/www-data/lambda/gluon/dal.py:7762(__getattr__)
>>>        89    0.012    0.000    0.014    0.000 
>>> /home/www-data/lambda/gluon/validators.py:450(__init__)
>>>         6    0.005    0.001    0.005    0.001 
>>> /usr/lib/python2.7/socket.py:223(meth)
>>>
>>>
>>> To further confirm this, I removed most of the table definitions (~100) 
>>> and kept just the auth_user table in db.py. This improved the response time 
>>> significantly.
>>>
>>> Concurrency Level:      25
>>> Time taken for tests:   2.150 seconds
>>> Complete requests:      50
>>> Failed requests:        0
>>> Write errors:           0
>>> Total transferred:      588512 bytes
>>> HTML transferred:       567000 bytes
>>> Requests per second:    23.25 [#/sec] (mean)
>>> Time per request:       1075.173 [ms] (mean)
>>> Time per request:       43.007 [ms] (mean, across all concurrent 
>>> requests)
>>> Transfer rate:          267.27 [Kbytes/sec] received
>>>
>>> Connection Times (ms)
>>>               min  mean[+/-sd] median   max
>>> Connect:        1    1   0.1      1       1
>>> Processing:   291  901 296.5   1011    1230
>>> Waiting:      288  899 296.4   1011    1230
>>> Total:        292  902 296.5   1012    1232
>>>
>>> Percentage of the requests served within a certain time (ms)
>>>   50%   1012
>>>   66%   1103
>>>   75%   1120
>>>   80%   1140
>>>   90%   1182
>>>   95%   1229
>>>   98%   1232
>>>   99%   1232
>>>  100%   1232 (longest request)
>>>
>>>
>>> Earlier benchmark logs looked like
>>>
>>>
>>> Concurrency Level:      25
>>> Time taken for tests:   8.882 seconds
>>> Complete requests:      50
>>> Failed requests:        0
>>> Write errors:           0
>>> Total transferred:      588190 bytes
>>> HTML transferred:       567000 bytes
>>> Requests per second:    5.63 [#/sec] (mean)
>>> Time per request:       4440.767 [ms] (mean)
>>> Time per request:       177.631 [ms] (mean, across all concurrent 
>>> requests)
>>> Transfer rate:          64.67 [Kbytes/sec] received
>>>
>>> Connection Times (ms)
>>>               min  mean[+/-sd] median   max
>>> Connect:        1    1   0.7      1       6
>>> Processing:  1883 4011 1211.9   3863    5865
>>> Waiting:     1882 4008 1211.6   3856    5861
>>> Total:       1884 4012 1211.9   3864    5867
>>>
>>> Percentage of the requests served within a certain time (ms)
>>>   50%   3864
>>>   66%   4845
>>>   75%   5009
>>>   80%   5165
>>>   90%   5557
>>>   95%   5748
>>>   98%   5867
>>>   99%   5867
>>>  100%   5867 (longest request)
>>>  
>>> Any clues on what could be the cause of this? 
>>>
>>>

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to