On Friday, March 11, 2011 at 10:51 AM, Jim Schutt wrote:
> I'm also confused. Here's the code I ran:
>
> void put() {
> //generic_dout(0) << "RefCountedObject::put " << this << " " << nref.read()
> << " -> " << (nref.read() - 1) << dendl;
> if (nref.dec() == 0) {
> utime_t s = g_clock.now();
> delete this;
> utime_t e = g_clock.now();
> if (double(e - s) > 0.5) {
> generic_dout(1) << "RefCountedObject::put delete " << this << " took " <<
> double(e - s) << " secs!" << dendl;
> }
> }
> }
>
> I added those double casts, because I had a similar problem with my
> throttler->put
> test: without the casts, it was firing but the reported delay was less than
> 0.25 sec. Adding the casts stopped that - I haven't yet checked into why.
>
> Still checking for what I'm missing...
>
> -- Jim
Heh -- it turns out that operator double() is a little bit broken -- it divides
by the wrong constant! Pushed the (very simple) fix in
3fb4fd8612b7a05f7d89cfd0b48f765c79830f95 to the stable branch.
This would be putting everything into the wrong order of magnitude. Half second
delete issues are a lot more believable (to me at least!) than 5 second ones,
and I wouldn't be surprised if they were the fault of the default memory
allocator combined with the throttler getting bogged down. (Apparently even
tcmalloc will do a better job of memory management if memory is freed from the
same thread it's allocated in, and almost none of our memory use is polite in
that way.)
-Greg
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html