Почему разветвление замедляет мое приложение - PullRequest
3 голосов
/ 29 ноября 2011

Мое приложение получает контрольную точку каждые несколько 100 миллисекунд с помощью системного вызова fork .Однако я заметил, что мое приложение значительно замедляется при использовании контрольных точек (разветвления).Я проверил время, затраченное на fork вызов, и оказалось, что оно составляет от 1 до 2 мс.Так почему же fork так сильно тормозит мое приложение?Обратите внимание, что я сохраняю только одну контрольную точку (разветвленный процесс) за раз и убиваю предыдущую контрольную точку всякий раз, когда беру новую.Также у моего компьютера огромная оперативная память.

Обратите внимание, что мой раздвоенный процесс просто спит после создания.Он активируется только тогда, когда необходимо выполнить откат.Таким образом, это не должно быть запланировано ОС.Одна вещь, которая приходит мне в голову, состоит в том, что, поскольку fork является механизмом копирования при записи, возникают ошибки страницы, когда мое приложение изменяет страницу.Но должно ли это значительно замедлить работу приложения?Без контрольной точки (разветвления) мое приложение завершается примерно за 3,1 секунды, а с ним - около 3,7 секунды.Есть идеи, что тормозит мое приложение?

Ответы [ 3 ]

7 голосов
/ 29 ноября 2011

Вы, вероятно, наблюдаете стоимость механизма копирования при записи, поскольку вы выдвигаете гипотезу. Это на самом деле довольно дорого - это причина, по которой vfork все еще существует. (Основная стоимость - это не сами ошибки дополнительной страницы, а memcpy каждой страницы при ее касании, а также связанные кэш и сброс TLB.) Она не отображается как стоимость fork потому что ошибки страницы не происходят внутри системного вызова.

Вы можете подтвердить гипотезу, посмотрев время, указанное в getrusage - если это правильно, дополнительное время должно составлять почти все «системное» время (процессор сгорает внутри ядра). oprofile или perf позволит вам более конкретно определить проблему ... если вы сможете заставить их работать вообще, что, увы, нетривиально.

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

3 голосов
/ 29 ноября 2011

Я предлагаю использовать oprofile для выяснения.

oprofile считается способным профилировать систему (а не только один процесс).

Вы можете сравнить с другими пакетами контрольных точек , например BLCR

2 голосов
/ 29 ноября 2011

Форкинг по своей природе очень дорогой, так как вы создаете копию существующего процесса как совершенно новый процесс.Если скорость важна для вас, вы должны использовать темы.

Кроме того, вы говорите, что раздвоенный процесс спит, пока не потребуется «откат».Я не уверен, что вы подразумеваете под откатом, но при условии, что это то, что вы можете поместить в функцию, вы должны просто поместить ее в функцию, а затем создать поток, который просто запускает эту функцию и завершает работу, когда обнаруживаете необходимостьоткат.В качестве дополнительного бонуса, если вы используете этот метод, вы создаете ветку, только если она вам нужна.

...