Re: Scrub / SnapTrim IO Prioritization and Latency

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I *think* that would work.  Like I said though, most of the primary
side recovery work still occurs in its own threadpool and does not use
the prioritization scheme at all.
-Sam

On Thu, Oct 30, 2014 at 1:22 PM, Dan van der Ster
<daniel.vanderster@xxxxxxx> wrote:
> Hi Sam,
>
> October 30 2014 8:30 PM, "Samuel Just" <sam.just@xxxxxxxxxxx> wrote:
>> 1. Recovery is trickier, we probably aren't marking them with a
>> sufficiently high cost. Also, a bunch of the recovery cost
>> (particularly primary-side backfill scans and pushes) happens in the
>> recovery_tp (something that this design would fix) rather than in the
>> OpWQ.
>>
>> 2. The OpWq does have a separate queue for each priority level. For
>> priorities above 63, the queues are strict -- we always process
>> higher queues until empty. For queues 1-63, we try to weight by
>> priority. I could add a "background" queue (<0?) concept which only
>> runs when above queues are empty, but I worry about deferring scrub
>> and snap trimming for too long.
>>
>
> Is there something preventing me from setting osd_client_op_priority to 64 -- for a test? That would more or less simulate the existence of a background queue, right? (I mean, if I could make client ops use enqueue_strict that might help with recovery transparency...)
>
>> 3. The whole pg lock is necessary basically because ops are ordered on
>> a pg basis.
>>
>> 4. For a non-saturated cluster, the client IO queue (63) will tend to
>> have the max number of tokens when an IO comes in, and that IO will
>> tend to be processed immediately.
>
> Meaning Ceph will dispatch it immediately -- sure. I'm more worried about IOs ongoing or queued in the kernel.
>
>> I was mentioning that as a worst
>> case scenario. Scrub already won't even start on a pg unless the OSD
>> is relatively unloaded.
>
> In our case, scrub always waits until the max interval expires. So there is always load, yet always enough IOPS left to get the scrub done transparently.
>
> Actually, in case it wasn't obvious.. my whole argument is based on experience with OSDs having a colocated journal and FileStore -- no SSD. With a dedicated (or at least separate) journal device, I imagine that most of the impact of scrubbing/trimming on write latency would drop to zero. Maybe it's not worth optimising Ceph for RBD clusters that didn't spend the money on fast journals.
>
> Cheers, Dan
>
>
>> -Sam
>>
>> On Thu, Oct 30, 2014 at 11:25 AM, Dan van der Ster
>> <daniel.vanderster@xxxxxxx> wrote:
>>
>>> Hi Sam,
>>> A few comments.
>>>
>>> 1. My understanding is that your new approach would treat the scrub/trim ops similarly to (or
>> even
>>> exactly like?) how we treat recovery ops today. Is that right? Currently even with recovery op
>>> priority=1 and client op priority=63, recoveries are not even close to being transparent. It's
>>> anecdotal, but in our cluster we regularly have 30 OSDs scrubbing (out of ~900) and it is latency
>>> transparent. But if we have 10 OSDs backfilling that increases our 4kB write latency from ~40ms
>> to
>>> ~60-80ms.
>>>
>>> 2. I get the impression that you're worried that the idle IO priority class leaves us at a risk
>> of
>>> starving the disk thread completely. Except in extreme situations of an OSD that is 100%
>> saturated
>>> with client IO for a very long time, that shouldn't happen. Suppose the client IOs account for a
>>> 30% duty cycle of a disk, then scrubbing can use the other 70%. Regardless of which IO priority
>> or
>>> queuing we do, the scrubber will get 70% of time on the disk. But the important thing is that the
>>> client IOs need to be handled as close to real time as possible, whereas the scrubs can happen at
>>> any time. I don't believe ceph-level op queuing (with a single queue!) is enough to ensure this
>> --
>>> we also need to tell the kernel the priority of those (concurrent) IOs so it can preempt the
>>> unimportant scrub reads with the urgent client IOs. My main point here is that (outside of the
>>> client IO saturation case), bytes scrubbed per second is more or less independent of IO
>> priority!!!
>>>
>>> 3. Re: locks -- OK, I can't comment there. Perhaps those locks are the reason that scrubs are
>> ever
>>> so slightly noticeable even when the IO priority of the disk thread is idle. But I contend that
>>> using separate threads -- or at least separate queues -- for the scrubs vs client ops is still a
>>> good idea. We can learn from how cfq prioritizes IOs, for example -- each of real time, best
>>> effort, and idle are implemented as a separate queue, and the be/idle queues are only processed
>> if
>>> the rt/be queues are empty. (in testing I noticed that putting scrubs in be/7 (with client IOs
>> left
>>> in be/4) is not nearly as effective as putting scrubs in the idle class -- what I conclude is
>> using
>>> a single queue for both scrub/client IOs is not effective at reducing latency).
>>>
>>> BTW, is the current whole-PG lock a necessary result of separating the client and disk
>>> queues/threads? Perhaps that can be improved another way...
>>>
>>> 4. Lastly, are you designing mainly for the 24/7 saturation scenario? I'm not sure that's a good
>>> idea -- IMHO long term saturation is a sign of a poorly dimensioned cluster. If OTOH a cluster is
>>> saturated for only 12 hours a day, I honestly don't want scrubs during those 12 hours; I'd rather
>>> they happen at night or whatever. I guess that is debatable, so you better have a configurable
>>> priority (which you have now!). For reference, btrfs scrub is idle by default [1], and zfs [2]
>>> operates similarly. (I can't confirm md raid scrubs with idle priority, but based on experience
>> it
>>> is transparent). They all have knobs to increase the priority for admins with saturated servers.
>> So
>>> I don't see why the Ceph default should not be idle (and I worry that you'd even remove the idle
>>> scrub capability).
>>>
>>> In any case, I just wanted raise this issue so that you might consider them in your
>> implementation.
>>> If I can be of any help at all in testing or giving feedback please don't hesitate to let me
>> know.
>>>
>>> Best Regards,
>>> Dan
>>>
>>> [1] https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs-scrub
>>> [2] http://serverfault.com/questions/499739/tuning-zfs-scrubbing-141kb-s-running-for-15-days
>>>
>>> October 30 2014 5:57 PM, "Samuel Just" <sam.just@xxxxxxxxxxx> wrote:
>>>> I think my main concern with the thread io priority approach is that
>>>> we hold locks while performing those operations. Slowing them down
>>>> will block any client operation on the same pg until the operation
>>>> completes -- probably not quite what we want. The number of scrub ops
>>>> in the queue should not have an impact, the intention is that we do 63
>>>> "cost" of items out of the 63 queue for every 1 "cost" we do out of
>>>> the 1 priority queue. It's probably the case that 1-63 isn't enough
>>>> range, might make sense to make the priority range finer (x10 or
>>>> something). You seem to be arguing for a priority of 0, but that
>>>> would not guarantee progress for snap removal or scrub which would, I
>>>> think, not be acceptable. We do want snap trims and scrub to slow
>>>> down client IO (when the cluster is actually saturated) a little.
>>>> -Sam
>>>>
>>>> On Thu, Oct 30, 2014 at 3:59 AM, Dan van der Ster
>>>> <daniel.vanderster@xxxxxxx> wrote:
>>>>
>>>>> Hi Sam,
>>>>> Sorry I missed the discussion last night about putting the trim/scrub operations in a priority
>>>>
>>>> opq
>>>>> alongside client ops. I had a question about the expected latency impact of this approach.
>>>>>
>>>>> I understand that you've previously validated that your priority queue manages to fairly
>>>>
>>>> apportion
>>>>> bandwidth (i.e. time) according to the relative op priorities. But how are the latency of
>> client
>>>>> ops going to be affected when the opq is full of scrub/trim ops? E.g. if we have 10000 scrub
>> ops
>>>>
>>>> in
>>>>> the queue with priority 1, how much extra latency do you expect a single incoming client op
>> with
>>>>> priority 63 to have?
>>>>>
>>>>> We really need scrub and trim to be completely transparent (latency- and bandwidth-wise). I
>>> agree
>>>>> that your proposal sounds like a cleaner approach, but the current implementation is actually
>>>>> working transparently as far as I can tell.
>>>>>
>>>>> It's just not obvious to me that the current out-of-band (and backgrounded with idle io
>>> priority)
>>>>> scrubber/trimmer is a less worthy approach than putting those ops in-band with the clients IOs.
>>>>> With your proposed change, at best, I'd expect that every client op is going to have to wait
>> for
>>>>
>>>> at
>>>>> least one ongoing scrub op to complete. That could be 10's of ms's on an RBD cluster... bad
>>> news.
>>>>> So I think, at least, that we'll need to continue ionicing the scrub/trim ops so that the
>> kernel
>>>>> will service the client IOs immediately instead of waiting.
>>>>>
>>>>> Your overall goal here seems to put a more fine grained knob on the scrub/trim ops. But in
>>>>
>>>> practice
>>>>> we just want those to be invisible.
>>>>>
>>>>> Thoughts?
>>>>>
>>>>> Cheers, Dan
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux