I'm thoroughly confused and increasingly desperate. *All* of the threads in my 
application periodically are blocked for 30-50 ms pretty regularly, about every 
150 ms.

I'm processing a bunch of data via NSOperations running in a couple of "serial" 
(maxConcurrentOperationCount = 1) NSOperationQueues. Each of the operations is 
itself synchronous (overriding -main). Everything works as expected. For 
performance reasons, I want to move one of the operation types to being 
asynchronous and eventually allow two concurrent operations.

So to start with, I took the synchronous code in -main, moved it into -start, 
and added the appropriate KVO notifications for isExecuting, isFinished, and 
implemented the right accessors etc. So effectively the operation says it's 
asynchronous, but all of its work is actually done in -start, followed by 
notifying it's finished. The work is all done correctly, but I noticed it took 
significantly longer to complete. 

Thankfully I have a nifty bit of debugging code which tracks the start and ends 
of each of these operations and visualizes them, and this is what I noticed:
http://www.sethwillits.com/temp/upshot/upshot_yJutoKqY.png

At very regular intervals everything takes longer.

First I thought it maybe didn't like my semi-async op, so I made it truly 
async, and it behaved exactly the same. To make a long story short, I looked at 
this a few different ways in Instruments, and have confirmed that what's 
actually happening is *every thread is blocked* for those 30-50ms, and then it 
just wakes up and everything continues. The threads are literally all in 
"Blocked" states.


I can't figure out *why* everything is blocked. I can't figure out why simply 
making the NSOperation asynchronous would have this crazy effect. It's 100% 
reproducible.

For what it's worth, this one particular operation is doing some Metal 
rendering, and that operation is blocked during a call to -waitUntilCompleted. 
Which yes, sound suspicious, but is exactly what's happening in the 
very-explicitly-synchronous version of the operation, and it takes 10x less 
time. I am pretty certain this has nothing to do with the Metal rendering 
itself, and has more to do with something confusing the dispatch manager and 
every thread is being blocked. 


Can anyone think of what I should look for to figure out *why* they're blocked? 
Looking at the system calls in the Instruments trace timeline just isn't 
telling *me* anything.


--
Seth Willits




_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to