On Tue, Nov 26, 2013 at 2:44 AM, Anthony <[email protected]> wrote:

> So, is time for 25 concurrent requests significantly greater than 25*[time
> for a single request]?
>
>
No, time for 25 concurrent requests is smaller than 25*[time for a single
request].
Avg. time taken per request is 4 to 5 times though. They should be
processed in parallel not sequentially, right?

Ideally, I would expect time for 25 concurrent requests ~= 1*[time for a
single request].


Thanks,
Saurabh


> 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 a topic in the
> Google Groups "web2py-users" group.
> To unsubscribe from this topic, visit
> https://groups.google.com/d/topic/web2py/rH1C7iXMPNA/unsubscribe.
> To unsubscribe from this group and all its topics, send an email to
> [email protected].
> For more options, visit https://groups.google.com/groups/opt_out.
>

-- 
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