almost Sampling Profiler & Rogue case of App Profiling | by Akash Khunt | Mar, 2023 will cowl the most recent and most present suggestion as regards the world. proper to make use of slowly correspondingly you comprehend capably and accurately. will mass your information dexterously and reliably
This can be a publish on how a false constructive efficiency problem (i.e. Most important thread idle for ~1 second throughout software startup) brought on me to spend many days debugging and figuring out the basis trigger. This problem was solely seen when profiling a launch construct, and that too is on a tool that was restricted in reminiscence (RAM) and CPU energy.
First let’s cowl some background. In case you’ve just lately tried profiling an Android app to determine/debug some efficiency points or simply to seize startup time metrics, you is likely to be accustomed to a quite common however very helpful suggestion that it’s best to at all times create a profile. profile. launch construct
The explanation behind the use launch is constructed whereas it’s outlined is that debug The builds incur important and assorted efficiency degradation, and should not helpful for timing precisely. This efficiency degradation might be attributed to one of many many debugging construct capabilities that permits builders to connect a debugger at any time, which requires monitoring of many issues, equivalent to reminiscence and stack traces.
However since launch builds are supposed to be non-debuggable and better performing, they do not observe something out of the field and are due to this fact not profilerable. To handle this problem, the Android staff launched profileable manifest configuration in API 29, which is secure to maintain even throughout launch builds, permitting us to profile a launch construct with a lot much less efficiency overhead and minimal concern about information publicity, as construct instruments Host profiles and the shell course of can’t learn information from reminiscence.
I confronted this fundamental thread idle problem once I was profiling our app on totally different units of units to cut back chilly begin time. To get the beginning time (i.e., TTID & TTFD) I created a macro reference level module in my app. The great thing about macrobenchmark testing is that it additionally generates systrace recordsdata that you should utilize to grasp what totally different threads are doing at any given time. From the take a look at outcomes, I discovered a number of the bottlenecks, one of many greatest ones was the consumer attribution callback, which concerned a community name that contributed 20%-25% of the TTFD time. .
The issue right here was that we have been making the Person wait till we received the decision attribution information from the community. From systrace information at a low stage (2GB RAM) we additionally noticed that the primary thread was idle for ~1 second 😲 as you’ll be able to see within the screenshot beneath.
Word: The title of the primary thread will likely be hidden for confidentiality of the applying.
This appeared like a simple win to cut back chilly begin time, so we began dialogue with our product staff and received approval to proceed with deferred dealing with of the attribution callback, i.e., enable the consumer to proceed to our house web page with out blocking it.
Very attentive eyes might need additionally observed from the systrace screenshot above that Jit Thread Pool it is also working for an honest period of time which might be considerably diminished by integrating Reference profiles. 🙂
After making the suitable change, we ran the exams once more and noticed that our TTFD time was diminished by ~20% on a high-end machine (8 GB RAM and Android 13), however on a lower-end machine (2 GB RAM and Android 10) it was nonetheless very comparable. As a primary troubleshooting step, we ran the startup time take a look at once more (like many issues in life, the primary troubleshooting step is at all times to retry the failed step 😉) however the outcome was the identical 😅.
I then ended up spending a number of days figuring out the problem that is likely to be inflicting the primary thread to hold for 1 second, however discovered nothing. Then at some point, I used to be randomly what every of the threads spawned by our software was doing when the primary thread went to sleep and I lastly discovered the wrongdoer. he was the Sampling Profiler the thread that for some cause solely appeared alive for 1 second (precisely on the similar time the primary thread went to sleep), the place more often than not it was additionally sleeping, as proven within the screenshot beneath.
By reviewing the traces of the Sampling Profiler thread, I found that it was primarily performing two operations which have been Connect present thread & Detach CurrentThread As proven beneath.
I additionally tried transferring a whole lot of code right here and there to see if there have been any particular situations that might result in beginning this Sampling Profiler thread, a really imprecise correlation I noticed was each time the primary thread appeared idle for a number of hundred milliseconds. , the Sampling Profiler was spawning to do its job.
Just like the title “Sampling Profiler” means that it gave the impression to be performing some profiling associated work, so we concluded that it should not have an effect on precise consumer periods. However since we nonetheless needed to make sure, I eliminated the <profileable> ingredient of the Manifest file to make sure that the applying just isn’t even profileable when capturing the traces. And the way did I take away the ingredient?
I hope this publish saves you a number of hours if not days debugging an issue that does not even have an effect on actual customers 🙂.
I want the article almost Sampling Profiler & Rogue case of App Profiling | by Akash Khunt | Mar, 2023 provides sharpness to you and is beneficial for complement to your information
Sampling Profiler & Rogue case of App Profiling | by Akash Khunt | Mar, 2023