2009-07-29 1 views
0

Пожалуйста, укажите мне инструменты или способ контроля того, какой из них работает на миллисекундах? Благодарю.Пожалуйста, укажите мне инструменты или способ отслеживания того, что thead работает в миллисекундах

Предположим, у меня есть 3 нить работает, и я хочу, как показано ниже детали:

0 - 20ms thread1 
20 - 40ms thread2 
40 - 50ms thread1 
50 - 70ms thread3 

ПРИМЕЧАНИЯ:, я предпочитаю, чтобы решить эту проблему без взлома ядра.

EDIT:

  1. в MIPS кроссплатформенного с 2.6.21 ядра Linux

  2. команды TOP может предоставить некоторую информацию о потоке, но не слишком много.

+0

Интересный вопрос. Однако у меня, похоже, есть плохая привычка принимать худшее, поэтому я должен спросить. Разве это так, что вы можете решить проблему синхронизации в многопоточном приложении, посмотрев, где поставить паузу, чтобы проблема исчезла? Если это так, пожалуйста, не делайте этого, потому что любите хороший код повсюду. ;) – Sean

+0

@Eru: НЕТ, это не то, что я хочу сделать. Вот предыстория вопроса, если вы заинтересованы в http: //www.nabble.com/search-time-is -dedevelop-in-multi-thread-enviroment-td24693604.html – pierrotlefou

ответ

3

Вы можете использовать LTTng для отслеживания планирования деятельности (наряду с множеством других вещей!) С соответствующим образом сконфигурированной ядра.

Это говорит о том, что я посмотрел на вашу связку - ваша настоящая проблема, похоже, что ваш поток записи блокирует прочитанный поток, не так ли? Одна вещь, которую следует рассмотреть, - это использовать базу данных, которая поддерживает одновременные чтения и записи. Или используйте протокол блокировки, чтобы заблокировать поток записи, когда поток чтения активен.

Например, у вас может быть мьютекс, condvar и значение want_read. Перед каждой записью поток записи принимает мьютекс и проверяет значение want_read. Если он отличен от нуля, он блокируется на конденсате. Между тем, прочитанный поток будет увеличивать want_read под мьютексом, когда он начнется, и, когда это будет сделано, уменьшит его и транслирует на condvar. Это должно привести к тому, что поток записи будет заблокирован, как только он станет безопасным, когда хочет прочитать поток.

+0

Это мощный. Но мне понадобится 2 недели, чтобы установить это. – pierrotlefou

+0

Напиток будет замедлять время поиска, а другой занятый поток, похоже, также замедляет время поиска. Это то, что я хочу подтвердить. – pierrotlefou

1

Для вашей конкретной проблемы, о которой вы упоминали в комментарии, поток без usleep сделает поток занятым, который займет много ресурсов процессора. Затем вы получите медленный запрос поиска базы данных.

Для общего, если вы хотите проверить последовательность расписания потоков и не хотите беспокоиться об установке lttng, вы можете использовать трюк. Я добавляю несколько простых syscall, таких как open, close, time с недопустимым параметром для ключевого пути потока (который является низкими накладными расходами по сравнению с printf, а printf иногда связан с блокировкой потоков), а затем вы можете использовать инструмент strace для отслеживания всех этих потоков. Проверьте журнал strace, вы можете увидеть, когда они запланированы, когда будет запущен другой поток. Тогда вы получите общее представление о том, что поток занимает большую часть времени, и какой поток занимает большую часть времени системы.

Lttng, безусловно, лучший инструмент для такой проблемы, только если вы можете заставить его работать.

+0

Это классный трюк! Я пытаюсь понять, могу ли я понять. – pierrotlefou

1

Intel Concurrency Checker будет работать на windows и linux. Я не использовал его, поэтому я не знаю много деталей, но я слышал, что он выполнит измерения производительности. Возможно, стоит попробовать.