On 02/24/2013 01:02 AM, Roberto De Ioris wrote:
>> Hello,
>>
>> I am using the uWSGI cache feature to reduce the number of DB queries. The
>> flow looks like this (code is written in Python):
>>
>> request comes in:
>>
>> value = cache_get(key)
>> if value:
>>     return value
>> else:
>>     value = db_query(...)
>>     cache_set(key, pickle.dumps(value), 60)
>>
>> It works well for few minutes. After that, it calls cache_set for some
>> keys more than once every 60 second (once a second or more frequently). I
>> would expect cache_set to not be called more than once every 60 seconds
>> because I pass expires=60 to cache_set.
>>
>> cache_get doesn't return anything even if cache_set succeeds (return value
>> is True). This is what worries me.
>>
>> Let me know if you need more details.
>>
>> uWSGI config:
>>
>> [uwsgi]
>> socket=/var/run/uwsgi.sock
>> master=true
>> enable-threads=true
>> listen=8192
>> socket-timeout=60
>> buffer-size=8192
>> pidfile=/var/run/uwsgi.pid
>> module=app.start
>> pythonpath=blabla
>> processes=8
>> threads=0
>> daemonize=/var/log/uwsgi.log
>> disable-logging=false
>> logto=/var/log/uwsgi-access.log
>> logdate=true
>> no-orphans=true
>> vacuum=true
>> uid=user
>> gid=group
>> cache=10000
>> cache-blocksize=4096
>> cache-report-freed-items=true_______________________________________________
>> uWSGI mailing list
>> [email protected]
>> http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi
>>
>
> Just two things:
>
> - be sure to run a version >= 1.4.4 as older version had a corner-case bug
> in which collisioned keys could be swallowed (if you have lot of
> collisions you could have hit that)
>
> - remember that cache_set does not overwrite already-existent keys. Use
> cache_update if you want auto-overwrite.
>
I am using 1.4.5. I used to encounter the deadlock issue with 0.9.9.2 so
I moved to the latest version recently.

What I am seeing right now happens rarely but it fills up the cache
(10000 elements) even if I am only trying to store about 80 keys. When
that issue happens, I see cache_set being called over and over for the
same key and cache_get keeps returning None. It quickly fills up the
cache even if cache_set is called for the same key.

cache is empty.
cache_set: key1, expires 60.
cache_set: key1, expires 60.
cache_get: key1 -> None.
cache_set: key1, expires 60.
cache_get: key1 -> None.
...
cache is reported as full in the log.

cache_set is called for the same key from multiple workers but with the
uWSGI locking mechanism, it should not be an issue and cache_get should
return something after the first cache_set succeeds.

I am puzzled right now.
_______________________________________________
uWSGI mailing list
[email protected]
http://lists.unbit.it/cgi-bin/mailman/listinfo/uwsgi

Reply via email to