06.05.2019 7:24, Liang Li wrote:
> On Tue, Apr 30, 2019 at 10:35:32AM +0000, Vladimir Sementsov-Ogievskiy wrote:
>> 28.04.2019 13:01, Liang Li wrote:
>>> If the backup target is a slow device like ceph rbd, the backup
>>> process will affect guest BLK write IO performance seriously,
>>> it's cause by the drawback of COW mechanism, if guest overwrite the
>>> backup BLK area, the IO can only be processed after the data has
>>> been written to backup target.
>>> The impact can be relieved by buffering data read from backup
>>> source and writing to backup target later, so the guest BLK write
>>> IO can be processed in time.
>>> Data area with no overwrite will be process like before without
>>> buffering, in most case, we don't need a very large buffer.
>>>
>>> An fio test was done when the backup was going on, the test resut
>>> show a obvious performance improvement by buffering.
>>
>> Hi Liang!
>>
>> Good thing. Something like this I've briefly mentioned in my KVM Forum 2018
>> report as "RAM Cache", and I'd really prefer this functionality to be a 
>> separate
>> filter, instead of complication of backup code. Further more, write notifiers
>> will go away from backup code, after my backup-top series merged.
>>
>> v5: https://lists.gnu.org/archive/html/qemu-devel/2018-12/msg06211.html
>> and separated preparing refactoring v7: 
>> https://lists.gnu.org/archive/html/qemu-devel/2019-04/msg04813.html
>>
>> RAM Cache should be a filter driver, with an in-memory buffer(s) for data 
>> written to it
>> and with ability to flush data to underlying backing file.
>>
>> Also, here is another approach for the problem, which helps if guest writing 
>> activity
>> is really high and long and buffer will be filled and performance will 
>> decrease anyway:
>>
>> 1. Create local temporary image, and COWs will go to it. (previously 
>> considered on list, that we should call
>> these backup operations issued by guest writes CBW = copy-before-write, as 
>> copy-on-write
>> is generally another thing, and using this term in backup is confusing).
>>
>> 2. We also set original disk as a backing for temporary image, and start 
>> another backup from
>> temporary to real target.
>>
>> This scheme is almost possible now, you need to start backup(sync=none) from 
>> source to temp,
>> to do [1]. Some patches are still needed to allow such scheme. I didn't send 
>> them, as I want
>> my other backup patches go first anyway. But I can. On the other hand if 
>> approach with in-memory
>> buffer works for you it may be better.
>>
>> Also, I'm not sure for now, should we really do this thing through two 
>> backup jobs, or we just
>> need one separate backup-top filter and one backup job without filter, or we 
>> need an additional
>> parameter for backup job to set cache-block-node.
>>
> 
> Hi Vladimir,
> 
>     Thanks for your valuable information. I didn't notice that you are 
> already working on
> this,  so my patch will conflict with your work. We have thought about the 
> way [2] and
> give it up because it would affect local storage performance.
>     I have read your slice in KVM Forum 2018 and the related patches, your 
> solution can
> help to solve the issues in backup. I am not sure if the "RAM cache" is a 
> qcow2 file in
> RAM? if so, your implementation will free the RAM space occupied by BLK data 
> once it's
> written to the far target in time? or we may need a large cache to make 
> things work.
>     Two backup jobs seems complex and not user friendly, is it possible to 
> make my patch
> cowork with CBW?

No, I don't think that RAM cache should be qcow2 in RAM.. What you are doing is 
actually caching
CBW data in RAM. To do it when CBW is done in backup-top filter driver, there 
are two ways:

1. Do caching insided backup-top filter - it would be like your approach of 
caching inside CBW
operations. I think this is bad way.

2. Make separate filter driver for caching - RAM Cache. Probably, it should 
store in-flight
requests as is, just list of buffers and offsets.



-- 
Best regards,
Vladimir

Reply via email to