<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 18, 2017 at 1:44 PM, Michael Lackner <span dir="ltr"><<a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.<wbr>at</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello again,<br>
<br>
1.) I have another question about x265s' NUMA support. After looking at the behavior of<br>
--pools and at the documentation, it became clear that x265 doesn't actually create<br>
individual thread pools for each NUMA node automatically.<br>
<br>
So on my 2-socket, 32-thread server, I just did it manually with '--pools="16,16"', and<br>
now it spawns two pools with 16 threads each instead of one pool with 32 threads.<br>
<br>
Problem: The overall performance drops by ~15%, and when looking at the behavior, one of<br>
the two pools would often drop to 0-10% CPU usage for a few seconds, then start loading<br>
the CPU again, then drop again for several seconds, etc. It seems as if the second pool<br>
(and *only* the second pool, it doesn't happen for the first) needs to wait for something.<br>
<br>
This doesn't happen when spawning just one pool with 32 threads (x265s' default behavior).<br>
Load is near-maximum all the time, encode is faster.<br>
<br>
Other parallelization options, identical for all cases: '--wpp --pmode --pme --slices 4<br>
--lookahead-slices 4 --ctu 16 --max-tu-size 16 --qg-size 16'.<br>
<br>
Content is 8K again. Yeah, it works with '--pmode --pme' now, somehow, please don't ask me<br>
why, I have no idea..<br>
<br>
When searching the web I found this discussion, but it's pretty old:<br>
<br>
<a href="http://x265-devel.videolan.narkive.com/sbQflm3D/x265-cpu-utilization-very-low-on-a-multi-numa-sockets-server" rel="noreferrer" target="_blank">http://x265-devel.videolan.nar<wbr>kive.com/sbQflm3D/x265-cpu-uti<wbr>lization-very-low-on-a-multi-<wbr>numa-sockets-server</a><br>
<br>
They are talking about looking at 'DecideWait (ms)'. I've enabled frame stats with '--csv<br>
stats.txt --csv-log-level 2' to take look at potential issues.<br>
<br>
Ran:<br>
cat stats.txt | awk -F',' '{ print $33 "," $34 "," $36 "," $38 }' | sed 's/^\s//'<br>
<br>
This extracts all the "Wait" and "Stall Time" values, maybe this is relevant? I've<br>
attached the resulting files, one for a run with 2x16 NUMA thread pools and one for a run<br>
with just 1x32 thread pool spanning all CPUs across both nodes for a total of 117 frames.<br>
<br>
<br>
So actually using NUMA hurts performance? Should I not create thread pools for individual<br>
NUMA nodes after all? Or should I specify certain options to make this perform better than<br>
the flat topology/round-robin way of scheduling threads?<br>
<br></blockquote><div><br></div><div>The 15% performance drop in linux when a single pool across sockets, as opposed to a pool dedicated to each socket is created, is known. This is why the default behavior of x265 in linux is to launch a single pool across all sockets. If you want to use the --pools cli option to change this behavior, you will see different performance. To launch 32 threads in one pool across all sockets, you can say --pools 32 and it should work; this will also be the default behavior on a 2-socket machine. If you give --pools 16,16, you will get two pools, one per socket.</div><div><br></div><div>Unfortunately, on windows, there is no way to launch threads such that they work across both sockets. Therefore, the default behavior on windows is to launch a pool per socket. But I don't think this concerns your use case.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
2.) Also, one more thing that's scaring me, the documentation for '--pools' says:<br>
<br>
"[...] In the case that the total number of threads is more than the maximum size that<br>
ATOMIC operations can handle (32 for 32-bit compiles, and 64 for 64-bit compiles),<br>
multiple thread pools may be spawned subject to the performance constraint described<br>
above. [...]"<br>
<br>
What does "may be spawned" mean? Like "the user may do this by specifying --pools" or<br>
"x265 may or may not do this for the user automatically"?!<br></blockquote><div><br></div><div>There is a limitation that each pool can only handle up to 64 threads. (Bit vector used to track the threads can only be 64-bit at max in a 64-bit compile, and 32-bit at max in a 32-bit compile.). We therefore have some heuristics to decide when to break into multiple pools even in linux based on the total thread count of the machine and how far that number is from 64.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
Thanks for your time, and sorry if I'm asking something stupid! ;)<br></blockquote><div><br></div><div>No such thing as a stupid question :-).</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div class="m_4180236848025381503gmail-HOEnZb"><div class="m_4180236848025381503gmail-h5"><br>
<br>
On 05/10/2017 09:37 AM, Michael Lackner wrote:<br>
> On 05/10/2017 09:26 AM, Pradeep Ramachandran wrote:<br>
>> On Wed, May 10, 2017 at 12:32 PM, Michael Lackner <<br>
>> <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a>> wrote:<br>
>><br>
>>> On 05/10/2017 08:24 AM, Pradeep Ramachandran wrote:<br>
>>>> On Wed, May 10, 2017 at 11:12 AM, Michael Lackner <<br>
>>>> <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a>> wrote:<br>
>>>><br>
>>>>> Thank you very much for your input!<br>
>>>>><br>
>>>>> Since --pmode and --pme seem to break NUMA support, I disabled them. I<br>
>>>>> simply cannot tell<br>
>>>>> users that they have to switch off NUMA in their UEFI firmware just for<br>
>>>>> this one<br>
>>>>> application. There may be a lot of situations where this is just not<br>
>>>>> doable.<br>
>>>>><br>
>>>>> If there is a way to make --pmode --pme work together with x265s' NUMA<br>
>>>>> support, I'd use<br>
>>>>> it, but I don't know how?<br>
>>>><br>
>>>> Could you please elaborate more here? It seems to work ok for us here.<br>
>>> I've<br>
>>>> tried on CentOS and Win Server 2017 dual socket systems and I see all<br>
>>>> sockets being used.<br>
>>><br>
>>> It's like this: x265 does *say* it's using 32 threads in two NUMA pools.<br>
>>> That's just how<br>
>>> it should be. But it behaves very weirdly, almost never loading more than<br>
>>> two logical<br>
>>> cores. FPS are extremely low, so it's really slow.<br>
>>><br>
>>> CPU load stays at 190-200%, sometimes briefly dropping to 140-150%, where<br>
>>> it should be in<br>
>>> the range of 2800-3200%. As soon as I remove --pmode --pme, the system is<br>
>>> being loaded<br>
>>> very well! It almost never drops below the 3000% (30 cores) mark then.<br>
>>><br>
>>> I also works *with* --pmode --pme, but only if NUMA is disabled on the<br>
>>> firmware level,<br>
>>> showing only a classic, flat topology to the OS.<br>
>>><br>
>>> That behavior can be seen on CentOS 7.3 Linux, having compiled x265 2.4+2<br>
>>> with GCC 4.8.5<br>
>>> and yasm 1.3.0. The machine is a HP ProLiant DL360 Gen9 machine with two<br>
>>> Intel Xeon<br>
>>> E5-2620 CPUs.<br>
>>><br>
>>> Removing --pmode --pme was suggested by Mario *LigH* Rohkrämer earlier in<br>
>>> this thread.<br>
>>><br>
>><br>
>> This seems something specific with your configuration setup. I just tried<br>
>> an identical experiment on two systems that I have which are dual-socket<br>
>> E5-2699 v4s (88 threads spread across two sockets) running CentOS 6.8 and<br>
>> CentOS 7.2. I compiled x265 with gcc version 4.4 and am able to see<br>
>> utilization actually pick up closer to 5000% (monitored using htop) when<br>
>> --pme and --pmode are enabled in the command line; without these options,<br>
>> the utilization is closer to 3300%.<br>
><br>
> Hmm, crap. That would mean something's wrong with that HP server? But it's still very<br>
> strange. I've been able to reproduce this every time, even after a fresh reboot. Even if<br>
> it was a firmware bug, why would it trigger only when --pmode --pme are used...<br>
><br>
> Maybe I should try a newer Linux kernel and not the stock one CentOS 7.3 comes with?!<br>
><br>
> Any way to debug this and see what's going wrong? I have no idea what to do...<br>
><br>
>>> Here is my topology when NUMA is enabled (pretty simple):<br>
>>><br>
>>> # numactl -H<br>
>>> available: 2 nodes (0-1)<br>
>>> node 0 cpus: 0 1 2 3 4 5 6 7 16 17 18 19 20 21 22 23<br>
>>> node 0 size: 32638 MB<br>
>>> node 0 free: 266 MB<br>
>>> node 1 cpus: 8 9 10 11 12 13 14 15 24 25 26 27 28 29 30 31<br>
>>> node 1 size: 32768 MB<br>
>>> node 1 free: 82 MB<br>
>>> node distances:<br>
>>> node   0   1<br>
>>>   0:  10  21<br>
>>>   1:  21  10<br>
>>><br>
>>> Thanks!<br>
>>><br>
>><br>
>> You seem to have very little free memory in each node which might be making<br>
>> you go to disk and therefore affecting performance. I recommend trying to<br>
>> free some memory up before running x265 to see if that helps.<br>
><br>
> Nono, there was no swapping. It's just that the machine is currently in use transcoding 4K<br>
> stuff, so a some memory is actively allocated, and the rest is filled up with file<br>
> buffers, that's why numactl is showing this. See here:<br>
><br>
> # free<br>
>               total        used        free      shared  buff/cache   available<br>
> Mem:       65672976     7371344     5737328       17544    52564304    57687116<br>
> Swap:      97224700           0    97224700<br>
><br>
> For my test runs, I've even rebooted the machine and ran the test immediately afterwards.<br>
> There is nearly nothing on that machine, it's fresh. No servers, no X11, just the base<br>
> system with ffmpeg and x265 cli.<br>
><br>
>>>>> Ah yes, I've also found that 8K does indeed help a ton. With 4K and<br>
>>>>> similar settings, I'm<br>
>>>>> able to load 16-25 CPUs currently, sometimes briefly 30. With 8K, load<br>
>>> is<br>
>>>>> much higher.<br>
>>>>><br>
>>>>> Maybe you can advise how to maximize parallelization / loading as many<br>
>>>>> CPUs as possible<br>
>>>>> without breaking NUMA support on both Windows and Linux.<br>
>>>>><br>
>>>>> I'm saying this, because my benchmarking project is targeting multiple<br>
>>>>> operating systems,<br>
>>>>> it currently works on:<br>
>>>>>   * Windows NT 5.2 & 6.0 (wo. NUMA)<br>
>>>>>   * Windows NT 6.1 - 10.0 (w. NUMA)<br>
>>>>>   * MacOS X (wo. NUMA)<br>
>>>>>   * Linux (w. and wo. NUMA)<br>
>>>>>   * FreeBSD, OpenBSD, NetBSD and DragonFly BSD UNIX (wo. NUMA)<br>
>>>>>   * Solaris (wo. NUMA)<br>
>>>>>   * Haiku OS (wo. NUMA)<br>
>>>>><br>
>>>>> Thank you very much!<br>
>>>>><br>
>>>>> Best,<br>
>>>>> Michael<br>
>>>>><br>
>>>>> On 05/10/2017 07:21 AM, Pradeep Ramachandran wrote:<br>
>>>>>> Michael,<br>
>>>>>> Adding --lookahead-threads 2 statically allocated two threads for<br>
>>>>>> lookahead. Therefore, the worker threads launched to work on WPP will<br>
>>>>> 32-2<br>
>>>>>> = 30 in count. We've found some situations in which statically<br>
>>> allocating<br>
>>>>>> threads for lookahead was useful and therefore decided to expose it to<br>
>>>>> the<br>
>>>>>> user. Please see if this helps your use-case and enable appropriately.<br>
>>>>>><br>
>>>>>> Now as far as scaling up for 8K goes, a single instance of x265 scales<br>
>>> up<br>
>>>>>> well to 25-30 threads depending on the preset you're running in. We've<br>
>>>>>> found pmode and pme help performance considerably on some Broadwell<br>
>>>>> server<br>
>>>>>> systems but again, that is also dependent on content. I would encourage<br>
>>>>> you<br>
>>>>>> play with those settings and see if they help your use case. Beyond<br>
>>> these<br>
>>>>>> thread counts, one instance of x265 may not be beneficial for you.<br>
>>>>>><br>
>>>>>> Pradeep.<br>
>>>>>><br>
>>>>>> On Fri, May 5, 2017 at 3:26 PM, Michael Lackner <<br>
>>>>>> <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a>> wrote:<br>
>>>>>><br>
>>>>>>> I found the reason for "why did x265 use 30 threads and not 32, when I<br>
>>>>>>> have 32 CPUs".<br>
>>>>>>><br>
>>>>>>> Actually, it was (once again) my own fault. Thinking I know better<br>
>>> than<br>
>>>>>>> x265, I spawned<br>
>>>>>>> two lookahead threads starting with 32 logical CPUs<br>
>>>>> ('--lookahead-threads<br>
>>>>>>> 2').<br>
>>>>>>><br>
>>>>>>> It seems what x265 does is to reserve two dedicated CPUs for this, but<br>
>>>>>>> then it couldn't<br>
>>>>>>> permanently saturate them.<br>
>>>>>>><br>
>>>>>>> I still don't know when I should be starting with that stuff for 8K<br>
>>>>>>> content. 64 CPUs? 256<br>
>>>>>>> CPUs? Or should I leave everything to x265? My goal was to be able to<br>
>>>>>>> fully load as many<br>
>>>>>>> CPUs as possible in the future.<br>
>>>>>>><br>
>>>>>>> In any case, the culprit was myself.<br>
>>>>>>><br>
>>>>>>> On 05/04/2017 11:18 AM, Mario *LigH* Rohkrämer wrote:<br>
>>>>>>>> Am 04.05.2017, 10:58 Uhr, schrieb Michael Lackner <<br>
>>>>>>> <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a>>:<br>
>>>>>>>><br>
>>>>>>>>> Still wondering why not 32, but ok.<br>
>>>>>>>><br>
>>>>>>>> x265 will calculate how many threads it will really need to utilize<br>
>>> the<br>
>>>>>>> WPP and other<br>
>>>>>>>> parallelizable steps, in relation to the frame dimensions and the<br>
>>>>>>> complexity. It may not<br>
>>>>>>>> *need* more than 30 threads, would not have any task to give to two<br>
>>>>>>> more. Possibly.<br>
>>>>>>>> Developers know better...<br>
>>>>>>><br>
>>>>>>> --<br>
>>>>>>> Michael Lackner<br>
>>>>>>> Lehrstuhl für Informationstechnologie (CiT)<br>
>>>>>>> Montanuniversität Leoben<br>
>>>>>>> Tel.: +43 (0)3842/402-1505 | Mail: <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a><br>
>>>>>>> Fax.: +43 (0)3842/402-1502 | Web: <a href="http://institute.unileoben.ac" rel="noreferrer" target="_blank">http://institute.unileoben.ac</a>.<br>
>>>>>>> at/infotech<br>
>>>>>>> ______________________________<wbr>_________________<br>
>>>>>>> x265-devel mailing list<br>
>>>>>>> <a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
>>>>>>> <a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/l<wbr>istinfo/x265-devel</a><br>
>>>>><br>
>>>>> --<br>
>>>>> Michael Lackner<br>
>>>>> Lehrstuhl für Informationstechnologie (CiT)<br>
>>>>> Montanuniversität Leoben<br>
>>>>> Tel.: +43 (0)3842/402-1505 | Mail: <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a><br>
>>>>> Fax.: +43 (0)3842/402-1502 | Web: <a href="http://institute.unileoben.ac" rel="noreferrer" target="_blank">http://institute.unileoben.ac</a>.<br>
>>>>> at/infotech<br>
>>>>> ______________________________<wbr>_________________<br>
>>>>> x265-devel mailing list<br>
>>>>> <a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
>>>>> <a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/l<wbr>istinfo/x265-devel</a><br>
>>>>><br>
>>>>><br>
>>>>><br>
>>>>> N �n�r����)em�h�yhiם�w^��<br>
>>><br>
>>> --<br>
>>> Michael Lackner<br>
>>> Lehrstuhl für Informationstechnologie (CiT)<br>
>>> Montanuniversität Leoben<br>
>>> Tel.: +43 (0)3842/402-1505 | Mail: <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a><br>
>>> Fax.: +43 (0)3842/402-1502 | Web: <a href="http://institute.unileoben.ac" rel="noreferrer" target="_blank">http://institute.unileoben.ac</a>.<br>
>>> at/infotech<br>
>>> ______________________________<wbr>_________________<br>
>>> x265-devel mailing list<br>
>>> <a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
>>> <a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/l<wbr>istinfo/x265-devel</a><br>
>>><br>
>>><br>
>>><br>
>>> N �n�r����)em�h�yhiם�w^��<br>
<br>
<br>
--<br>
Michael Lackner<br>
Lehrstuhl für Informationstechnologie (CiT)<br>
Montanuniversität Leoben<br>
Tel.: +43 (0)3842/402-1505 | Mail: <a href="mailto:michael.lackner@unileoben.ac.at" target="_blank">michael.lackner@unileoben.ac.a<wbr>t</a><br>
Fax.: +43 (0)3842/402-1502 | Web: <a href="http://institute.unileoben.ac.at/infotech" rel="noreferrer" target="_blank">http://institute.unileoben.ac.<wbr>at/infotech</a><br>
</div></div><br>______________________________<wbr>_________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org" target="_blank">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" rel="noreferrer" target="_blank">https://mailman.videolan.org/l<wbr>istinfo/x265-devel</a><br>
<br></blockquote></div><br></div></div>