<p dir="ltr">So, I ran perf on my host and it came back far more true. The top consumers of time were all atomics and some function called sse3, which I believe is a super fast memcpy implementation provided the the arch. In addition, all the highest time consumers are within my image- it stayed out of the kernel as designed and it used additional extensions and features.</p>
<p dir="ltr">I just thought of something-what if there is some kind of page size difference between my host and my Linux kernel causing the performance problems?</p>
<p dir="ltr">On Nov 24, 2016 11:33 AM, &quot;Kenneth Adam Miller&quot; &lt;<a href="mailto:kennethadammiller@gmail.com">kennethadammiller@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; On Thu, Nov 24, 2016 at 11:13 AM, Greg KH &lt;<a href="mailto:greg@kroah.com">greg@kroah.com</a>&gt; wrote:<br>
&gt; &gt; On Thu, Nov 24, 2016 at 10:31:18AM -0500, Kenneth Adam Miller wrote:<br>
&gt; &gt;&gt; On Nov 24, 2016 2:18 AM, &quot;Greg KH&quot; &lt;<a href="mailto:greg@kroah.com">greg@kroah.com</a>&gt; wrote:<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt; On Thu, Nov 24, 2016 at 02:01:41AM -0500, Kenneth Adam Miller wrote:<br>
&gt; &gt;&gt; &gt; &gt; Hello,<br>
&gt; &gt;&gt; &gt; &gt;<br>
&gt; &gt;&gt; &gt; &gt;<br>
&gt; &gt;&gt; &gt; &gt; I have a scheduler issue in two different respects:<br>
&gt; &gt;&gt; &gt; &gt;<br>
&gt; &gt;&gt; &gt; &gt; 1) I have a process that is supposed to tight loop, and it is being<br>
&gt; &gt;&gt; &gt; &gt; given very very little time on the system. I don&#39;t want that - I want<br>
&gt; &gt;&gt; &gt; &gt; those who would use the processor to be given the resources to run as<br>
&gt; &gt;&gt; &gt; &gt; fast as they each can.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt; What is causing it to give up its timeslice?  Is it waiting for I/O?<br>
&gt; &gt;&gt; &gt; Doing something else to sleep?<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; It&#39;s multithreaded, so it reads in a loop in one thread and writes in<br>
&gt; &gt;&gt; another thread. What I saw when I ran strace on it is each process<br>
&gt; &gt;&gt; would run for too long- the program is designed to try and stay out of<br>
&gt; &gt;&gt; the kernel on each side, so it checks some shared variables before it<br>
&gt; &gt;&gt; ever goes.<br>
&gt; &gt;<br>
&gt; &gt; So locking/cpu contention for those &quot;shared variables&quot; perhaps?<br>
&gt;<br>
&gt; I don&#39;t think that could possibly be it, because the shared variables<br>
&gt; are controlled by atomics. It&#39;s just some memory operation to check to<br>
&gt; see if it needs to go to the kernel, as in is there more data in the<br>
&gt; shm region for me to read? If not, I&#39;ll go wait on this OS semaphore.<br>
&gt; It&#39;s lightening fast on my host machine.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;&gt; &gt; &gt; 2) I am seeing with perf that the maximum overhead at each section<br>
&gt; &gt;&gt; &gt; &gt; does not sum up to be more than 15 percent. Total, probably something<br>
&gt; &gt;&gt; &gt; &gt; like 18% of cpu time is used, and my binary has rocketed in slowness<br>
&gt; &gt;&gt; &gt; &gt; from about 2 seconds or less total to several minutes.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt; What changed to make things slower?  Did you change kernel versions or<br>
&gt; &gt;&gt; &gt; did you change something in your userspace program?<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; The kernel versions specifically couldnt have anything to do with it<br>
&gt; &gt;&gt; but it was different kernels. The test runs in less that 2 seconds on<br>
&gt; &gt;&gt; my host. When I copy it to our custom linux, it takes minutes for it<br>
&gt; &gt;&gt; to run. I think it&#39;s some extra setting that we&#39;re missing while<br>
&gt; &gt;&gt; building the kernel, and I don&#39;t know what that is. I got a huge<br>
&gt; &gt;&gt; improvement when I changed the multicore scheduling to allow<br>
&gt; &gt;&gt; preemption &quot;(desktop)&quot; but there&#39;s still a problem as I&#39;ve described<br>
&gt; &gt;&gt; with one of the processes not using the core as it should.<br>
&gt; &gt;<br>
&gt; &gt; What do you mean by &quot;custom linux&quot;?  Is this the exact same hardware as<br>
&gt; &gt; your machine?  Or different?  If so, what is different?  What is<br>
&gt; &gt; different between the different kernel versions you are using?  Does the<br>
&gt; &gt; perf output look different from running on the two different machines?<br>
&gt; &gt; If so, where?<br>
&gt;<br>
&gt; I am building with buildroot a linux that is meant to be really<br>
&gt; stripped down and only have the things we want. In my case, the what<br>
&gt; the bzImage sees is either what QEMU gives it or what it sees in our<br>
&gt; dedicated hardware, with is just off the shelf i7 and other stuff you<br>
&gt; get a market - nothing custom in the sense you are thinking. Custom as<br>
&gt; in, roll your own linux.<br>
&gt;<br>
&gt; The kernel versions between my host and the target are 3.13.x and<br>
&gt; 3.14.5x; they don&#39;t change so much, and certainly don&#39;t affect<br>
&gt; performance on their own. I&#39;m missing some setting or something with<br>
&gt; how I&#39;m configuring or building linux.<br>
&gt;<br>
&gt; I haven&#39;t had a chance to run perf on my host. I can&#39;t find what<br>
&gt; ubuntu package it is just yet, but I will search for it in a minute. I<br>
&gt; have to go somewhere and will be right back immediately.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt; Have you changed the priority levels of your application at all?  Have<br>
&gt; &gt; you thought about just forcing your app to a specific CPU and getting<br>
&gt; &gt; the kernel off of that CPU in order so that the kernel isn&#39;t even an<br>
&gt; &gt; option here at all (Linux allows you to do this, details are somewhere<br>
&gt; &gt; in the documentation, sorry, can&#39;t remember off the top of my head...)<br>
&gt; &gt;<br>
&gt;<br>
&gt; No, that may be it or help though. I thought that binding an<br>
&gt; application to a particular cpu had something to do with affinity and<br>
&gt; that there was some C api for it or something. That would work for our<br>
&gt; particular scenario, and we&#39;ve even talked about it, I just don&#39;t know<br>
&gt; how to do it yet.<br>
&gt;<br>
&gt; &gt; But really, you should track down what the differences are between your<br>
&gt; &gt; two machines/environments, as something is different that is causing the<br>
&gt; &gt; slow down.<br>
&gt;<br>
&gt; True - the kernel configuration is most suspect based on everything I<br>
&gt; know. The hardware differences between my host to the target we&#39;re<br>
&gt; building for is each modern, and well supported by linux. I&#39;m thinking<br>
&gt; it absolutely must have something to do with the way I&#39;ve built linux.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt; You haven&#39;t even said what kernel version you are using, and if you have<br>
&gt; &gt; any of your own kernel patches in those kernels.<br>
&gt; &gt;<br>
&gt;<br>
&gt; For the target hardware is 3.14.5x, and there aren&#39;t any kernel<br>
&gt; patches at this time; I&#39;ve disabled grsec while in the process of<br>
&gt; narrowing down what the problem is.<br>
&gt;<br>
&gt; &gt;&gt; &gt; &gt; I think that<br>
&gt; &gt;&gt; &gt; &gt; the linux scheduler isn&#39;t scheduling it, because this process is just<br>
&gt; &gt;&gt; &gt; &gt; some unit tests that double as benchmarks in that they shm_open a file<br>
&gt; &gt;&gt; &gt; &gt; and write into it with memcpy&#39;s.<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt; &gt; Are you sure that I/O isn&#39;t happening here like through swap or<br>
&gt; &gt;&gt; &gt; something else?<br>
&gt; &gt;&gt; &gt;<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; Well, we&#39;re using tmpfs and don&#39;t have a disk in the machine, but I<br>
&gt; &gt;&gt; will say this process is using all lot of the address space. One<br>
&gt; &gt;&gt; problem here is that the kernel has more ram than it thinks it does,<br>
&gt; &gt;<br>
&gt; &gt; What do you mean, is this a hardware issue?<br>
&gt;<br>
&gt; I don&#39;t think it&#39;s hardware; we&#39;re using this proprietary software<br>
&gt; beneath the linux kernel, but it&#39;s still ram of course. I can&#39;t say<br>
&gt; too too much, but what I can say is that while how much linux thinks<br>
&gt; it has could be affecting how it behaves, on our end we have the<br>
&gt; resources and can just change the configuration to make sure that<br>
&gt; linux sees and has enough ram. So that we can test on our end, and<br>
&gt; indeed we will.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;&gt; but what I want to emphasize is that I haven&#39;t changed the program to<br>
&gt; &gt;&gt; allocate any more than it was previously. I&#39;m not sure if that&#39;s a<br>
&gt; &gt;&gt; kernel change or some setting, but it went from 85% to 98%.<br>
&gt; &gt;<br>
&gt; &gt; What exactly went up by 17%?<br>
&gt;<br>
&gt; Consider the process that I was talking about that is meant to tight<br>
&gt; loop and burn on a core to be the &quot;end product process&quot;. This is<br>
&gt; different from the test benchmarks that I was explaining run so<br>
&gt; poorly.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;&gt; The reason<br>
&gt; &gt;&gt; why is that there is a large latency even without that big program in<br>
&gt; &gt;&gt; there; I can&#39;t run my standalone tests in qemu without it also taking<br>
&gt; &gt;&gt; minutes. I understand qemu has to emulate, and that&#39;s its not just a<br>
&gt; &gt;&gt; VM, but I&#39;m going from host CPU to guest, and the settings are the<br>
&gt; &gt;&gt; same.<br>
&gt; &gt;<br>
&gt; &gt; That doesn&#39;t really make much sense, why is qemu even in the picture<br>
&gt; &gt; here?  And no, qemu doesn&#39;t always emulate things, that depends on the<br>
&gt; &gt; hardware you are running it on, and what type of image you are running<br>
&gt; &gt; on it.<br>
&gt;<br>
&gt; Well, when I&#39;m not at work, I have to be able to run the bzImage on<br>
&gt; something, and I don&#39;t have a dedicated machine. So I run it in QEMU.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt;&gt; &gt; What does perf say is taking all of your time?<br>
&gt; &gt;&gt;<br>
&gt; &gt;&gt; When I ran perf what it appeared to indicate is that the largest<br>
&gt; &gt;&gt; consumer of time was my library, which should be right in either<br>
&gt; &gt;&gt; scenario because it should use stay out of the kernel as I&#39;ve designed<br>
&gt; &gt;&gt; it. In addition, the work takes place there anyway, so that&#39;s right.<br>
&gt; &gt;&gt; What&#39;s not right is the fact that the largest percent of time used is<br>
&gt; &gt;&gt; around 15%, and all the others combined don&#39;t add up to anything near<br>
&gt; &gt;&gt; 100.<br>
&gt; &gt;<br>
&gt; &gt; So perhaps you have other processes running on the machine that you are<br>
&gt; &gt; not noticing that is taking up the time slices?  Are you _sure_ nothing<br>
&gt; &gt; else is running?<br>
&gt;<br>
&gt; I&#39;m certain that there are other processes alive, but they are not<br>
&gt; using the CPU. This process is the only one running. I even gave qemu<br>
&gt; &quot;-smp 4&quot; because I want it to behave as close as possible to what it<br>
&gt; would if it were just on the host.<br>
&gt;<br>
&gt; &gt;<br>
&gt; &gt; Basically, you have a bunch of variables, and haven&#39;t been very specific<br>
&gt; &gt; with what really is changing, or even being used here, so there&#39;s not<br>
&gt; &gt; much specific that I can think of at the moment.<br>
&gt; &gt;<br>
&gt; &gt; thanks,<br>
&gt; &gt;<br>
&gt; &gt; greg k-h<br></p>