Вы можете абсолютно точно получить то, о чем просили, но я чувствую, что это будет гораздо менее полезно для вас, чем вы можете поверить.Подавляющее (огромное, огромное!) Большинство переключений контекста происходит в моменты, которые вы, вероятно, считаете «неинтересными».lstat64()
, mach_vm_map_trap()
, mach_msg_trap()
, mach_port_insert_member_trap()
, kevent_id()
, список можно продолжить.Большинство потоков проводят большую часть своего времени в стеке ОС.«Операция записи на удаленном сервере» не будет блокироваться после того, как она займет много времени.Он будет активно блокировать себя, потому что знает, что это займет (ошеломительно) длительный период времени.
Несмотря на это, вы, безусловно, можете исследовать это с помощью инструментов.Просто выберите профиль System Trace, и он покажет вам все потоки и системные ядра, и как ваши потоки и все другие потоки на устройстве планируются, каждый системный вызов и т. Д. И т. Д. И т. Д. Это огромный объем информации,Таким образом, вы обычно только профиль на несколько секунд за один раз.Но это будет выглядеть примерно так:
![Instruments with System Trace](https://i.stack.imgur.com/IWjJ3.png)
Это полезная информация, если вы находитесь в точке, где переключение контекста является основным узким местом.Это может произойти, если вы имеете дело с чрезмерной конкуренцией за блокировку, или если вы перебиваете кэш L1, потому что вас продолжают прерывать какие-то другие потоки.Так что если у вас есть какой-то поток, который, как вы ожидаете, будет продолжать работать довольно непрерывно, и он будет заблокирован, это действительно ценная информация.Или, если у вас есть два потока, которые, по вашему мнению, должны работать ровно, но они, кажется, борются (быстро переключаются), тогда вы можете поработать над этим.(Но это редко является одним из первых мест, где вы будете искать настройку производительности, если вы не работаете над достаточно низкоуровневым кодом.)
Из вашего описания, я думаю, вы можете иметь неверное представление опланировщик.Ничего в планировщике не будет порядка 10 секунд.В мире планировщика миллисекунды - это много времени.Вы должны думать о вещах, которые занимают микросекунды и даже наносекунды.Если вы работаете над кодом, предполагающим, что выборка данных из ОЗУ бесплатна, значит, вы выбрали неправильный временной масштаб. Сетевой вызов настолько смехотворно медленный, что его можно оценить как «навсегда». На уровне переключения контекста вы смотрите на такие события, как:
00:00.770.247 Virtual memory Zero Fill took 10.50 µs small_free_list_add_ptr ← (31 other frames)