<div dir="auto"><div>Thanks Artem,</div><div dir="auto"><br></div><div dir="auto">Indeed, using the `output` parameter increased the download speed from 120KB/s to >120MB/s (the max network performance I have). That's great!</div><div dir="auto"><br></div><div dir="auto">I'll look into the method definition and see what's the secret.</div><div dir="auto"><br></div><div dir="auto">Regards,</div><div dir="auto">Lucio<br><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Fri, Oct 14, 2022, 12:07 Artem Goncharov <<a href="mailto:artem.goncharov@gmail.com">artem.goncharov@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word;line-break:after-white-space"><div>```</div><div>import openstack</div><div><br></div><div>conn = openstack.connect()</div><div><br></div><div>conn.image.download_image(image_name, stream=True, output="data.iso”)</div><div>```</div><div><br></div><div>This gives me max performance of the network. Actually using stream=True may be slower (around 40%), but may be crucially necessary when dealing with huge images. Additionally you can specify chunk_size as param to download_image function, what aligns performance of stream vs non stream (for me stream=True and chunk_size=8192 resulted 2.3G image to be downloaded in 14 sec)</div><div><br></div><div><br><blockquote type="cite"><div>On 13. Oct 2022, at 23:24, Lucio Seki <<a href="mailto:lucioseki@gmail.com" target="_blank" rel="noreferrer">lucioseki@gmail.com</a>> wrote:</div><br><div><div dir="auto"><div>Yes, I'm using tqdm to monitor the progress and speed.</div><div dir="auto">I removed it, and it improved slightly (120kB/s -> 131kB/s) but not significantly :-/</div><div dir="auto"><br><div class="gmail_quote" dir="auto"><div dir="ltr" class="gmail_attr">On Thu, Oct 13, 2022, 16:54 Sean Mooney <<a href="mailto:smooney@redhat.com" target="_blank" rel="noreferrer">smooney@redhat.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Thu, 2022-10-13 at 16:21 -0300, Lucio Seki wrote:<br>
> Thanks Sean, that makes much easier to code!<br>
> <br>
> ```<br>
> ...<br>
> conn = openstack.connect(cloud_name)<br>
> <br>
> with open(path, 'wb') as image_file:<br>
>     response = conn.image.download_image(image_name)<br>
>     for chunk in tqdm(response.iter_content(), **tqdm_params):<br>
>         image_file.write(chunk)<br>
> ```<br>
> <br>
> And it gave me some performance improvement (3kB/s -> 120kB/s).<br>
> ... though it would still take several days to download an image.<br>
> <br>
> Is there some tuning that I could apply?<br>
this is what nova does<br>
<a href="https://github.com/openstack/nova/blob/master/nova/image/glance.py#L344" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/openstack/nova/blob/master/nova/image/glance.py#L344</a><br>
<br>
we get the image chunks by calling the data method on the glance client<br>
<a href="https://github.com/openstack/nova/blob/03d2715ed492350fa11908aea0fdd0265993e284/nova/image/glance.py#L373-L377" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/openstack/nova/blob/03d2715ed492350fa11908aea0fdd0265993e284/nova/image/glance.py#L373-L377</a><br>
then bwe basiclly just loop over the chunks and write them to a file like you are<br>
<a href="https://github.com/openstack/nova/blob/03d2715ed492350fa11908aea0fdd0265993e284/nova/image/glance.py#L413-L437" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/openstack/nova/blob/03d2715ed492350fa11908aea0fdd0265993e284/nova/image/glance.py#L413-L437</a><br>
we have some extra code for doing image verification but its basically the same as what you are doing<br>
we use eventlets to monkeypatch python io which can imporve performce but i woudl not expect it to be that dramatic<br>
and i dont think the glance clinet or opesntack client use eventlet so its sound liek something else is limiting the transfer speed.<br>
<br>
this is the glance client method we are invokeing <br>
<a href="https://github.com/openstack/python-glanceclient/blob/56186d6d5aa1a0c8fde99eeb535a650b0495925d/glanceclient/v2/images.py#L201-L271" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/openstack/python-glanceclient/blob/56186d6d5aa1a0c8fde99eeb535a650b0495925d/glanceclient/v2/images.py#L201-L271</a><br>
<br>
<br>
im not sure what tqdm is by the way is it meusrign the transfer speed of something linke that?<br>
does the speed increase if you remvoe that?<br>
<a href="http://i.ie/" rel="noreferrer noreferrer noreferrer" target="_blank">i.ie</a> can you test this via a simple time script and see how much downloads say in up to 60 seconds by lookign at the file size?<br>
<br>
assuming its <a href="https://github.com/tqdm/tqdm" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/tqdm/tqdm</a> perhaps the addtional io that woudl be doing to standard out is slowign it down?<br>
<br>
<br>
<br>
<br>
> <br>
> On Thu, Oct 13, 2022, 14:18 Sean Mooney <<a href="mailto:smooney@redhat.com" rel="noreferrer noreferrer" target="_blank">smooney@redhat.com</a>> wrote:<br>
> <br>
> > On Thu, 2022-10-13 at 13:30 -0300, Lucio Seki wrote:<br>
> > > Hi glance experts,<br>
> > > <br>
> > > I'm using the following code to download a glance image:<br>
> > > <br>
> > > ```<br>
> > > from glanceapi import client<br>
> > > ...<br>
> > > glance = client.Client(GLANCE_API_VERSION, session=sess)<br>
> > > ...<br>
> > > with open(path, 'wb') as image_file:<br>
> > >     data = glance.images.data(image_id)<br>
> > >     for chunk in tqdm(data, unit='B', unit_scale=True,<br>
> > unit_divisor=1024):<br>
> > >         image_file.write(chunk)<br>
> > > ```<br>
> > > <br>
> > > And I get a speed around 3kB/s. It would take months to download an<br>
> > image.<br>
> > > I'm using python3-glanceclient==3.6.0.<br>
> > > I even tried:<br>
> > > ```<br>
> > >     for chunk in tqdm(data, unit='B', unit_scale=True,<br>
> > unit_divisor=1024):<br>
> > >         pass<br>
> > > ```<br>
> > > to see if the bottleneck was the disk I/O, but didn't get any faster.<br>
> > > <br>
> > > In the same environment, when I use the glance CLI instead:<br>
> > > <br>
> > > ```<br>
> > > glance image-download --file $path $image_id<br>
> > > ```<br>
> > > I get hundreds of MB/s download speed, and it finishes in a few minutes.<br>
> > > <br>
> > > Is there anything I can do to improve the glanceclient performance?<br>
> > > I'm considering using subprocess.Popen(['glance', 'image-download', ...])<br>
> > > if nothing helps...<br>
> > have you considered using the openstacksdk instead<br>
> > <br>
> > the glanceclint is really only intendeted for other openstack service to<br>
> > use like<br>
> > nova or ironic.<br>
> > its not really ment to be used to write your onw code anymore.<br>
> > in the past it provided a programatic interface for interacting with glance<br>
> > but now you shoudl prefer the openstack sdk instead.<br>
> > <a href="https://github.com/openstack/openstacksdk" rel="noreferrer noreferrer noreferrer" target="_blank">https://github.com/openstack/openstacksdk</a><br>
> > <br>
> > > <br>
> > > Regards,<br>
> > > Lucio<br>
> > <br>
> > <br>
<br>
</blockquote></div></div></div>
</div></blockquote></div><br></div></blockquote></div></div></div>