Changes

346 bytes added ,  12:23, 16 January 2019
Line 90: Line 90:  
'''Summary:''' Optimize the pre-dump algorithm to avoid pinning to many memory in RAM
 
'''Summary:''' Optimize the pre-dump algorithm to avoid pinning to many memory in RAM
 
   
 
   
Current [[CLI/cmd/pre-dump|pre-dump]] mode suffers from several issues
+
Current [[CLI/cmd/pre-dump|pre-dump]] mode is used to write task memory contents into image
 +
files w/o stopping the task for too long. It does this by stopping the task, infecting it and
 +
draining all the memory into a set of pipes. Then the task is cured and resumed and the pipes'
 +
contents is written into images (maybe a [[page server]]). This approach creates a big stress
 +
on memory subsystem, as keeping all the memory in pipes creates a lot of unreclaimable memory
 +
(pages in pipes are not swappable), as well as the number of pipes themselves can be buge (as
 +
one pipe doesn't store more than a fixed certain amount of data).
   −
* It keeps all the memory in pipes, and their number can be huge due to limited one pipe size
+
We can try to use sys_read_process_vm() syscall to mitigate all of the above. To do this we
* It keeps all the memory in pipes and this memory is unreclaimable for that period
+
need to allocate a temporary buffer in criu, then walk the target process vm by copying the
* It [[parasite code|stops and infects]] tasks to drain memory from
+
memory piece-by-piece into it, then flush the data into image (or page server), then repeat.
 
  −
We can try to use sys_read_process_vm() syscall to mitigate all of the above. Benefits:
  −
 
  −
* No pipes, just copy data into temp buffer and send
  −
* Memory is always reclaimable
  −
* No infection is needed, just freeze, reset the tracker and proceed
      
Ideally there should be sys_splice_process_vm() syscall in the kernel, that does the same as
 
Ideally there should be sys_splice_process_vm() syscall in the kernel, that does the same as