[CRIU] [PATCH] proc_parse: Set bigger buffer for smaps FILE
Andrew Vagin
avagin at parallels.com
Thu Feb 13 12:50:58 PST 2014
On Thu, Feb 13, 2014 at 11:45:59PM +0400, Pavel Emelyanov wrote:
> We spend a lot of time reading the /proc/$pid/smaps file. The time
> is spent in two places:
>
> 1 kernel puts too many info into it
> 2 fgets pulls info in 1024-bytes chunks, info about one vma is
> typically bigger (up to 3k bytes) thus we call read() ~3 times
> per one vma, which increases the amount of time spent in kernel
> to re-fill this info
>
> Setting the internal buffer to PAGE_SIZE size reduces the amount of
> read()-s on ~60% during basic container dump. Setting bigger buffer
> doesn't work, as kernel feeds at most one vma per read() syscall
> regardless of the buffer size.
>
Acked-by: Andrew Vagin <avagin at parallels.com>
> Signed-off-by: Pavel Emelyanov <xemul at parallels.com>
>
> ---
>
> diff --git a/proc_parse.c b/proc_parse.c
> index 365688a..714a2cb 100644
> --- a/proc_parse.c
> +++ b/proc_parse.c
> @@ -246,6 +246,8 @@ int parse_self_maps_lite(struct vm_area_list *vms)
> return 0;
> }
>
> +static char smaps_buf[PAGE_SIZE];
> +
> int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_files)
> {
> struct vma_area *vma_area = NULL;
> @@ -268,6 +270,8 @@ int parse_smaps(pid_t pid, struct vm_area_list *vma_area_list, bool use_map_file
> if (!smaps)
> goto err;
>
> + setvbuf(smaps, smaps_buf, _IOFBF, sizeof(smaps_buf));
> +
> if (use_map_files) {
> map_files_dir = opendir_proc(pid, "map_files");
> if (!map_files_dir) /* old kernel? */
> _______________________________________________
> CRIU mailing list
> CRIU at openvz.org
> https://lists.openvz.org/mailman/listinfo/criu
More information about the CRIU
mailing list