LINUX.ORG.RU

Не все сисколы одинаково тяжелы?

 , ,


0

1

Сетевой сервер при каждой операции чтения/записи в сокет делает метку времени и регулярно проходится по массиву соединений в поисках тех которые нужно отвалить по таймауту.
Каждый раз приходится получать время вызывая time() и это натолкнуло на мысль что 2 сискола за раз это как-то накладно.
Возникла идея запустить отдельный поток в котором несколько раз в секунду будет получаться время и писаться в переменную. Переменную закрыть мьютексами, а из рабочего потока считывать значение по необходимости.

Вопрос следующий: а не перекроют ли все полученные выгоды расходы на работу с мьютексами?


Что-то я психанула...)))
Никакие мьютексы не нужны. Просто перед обработкой событий на сокетах сохранять текущее время, а при чтении/записи проставлять его, а не получать каждый раз вызововом time()

nyka
() автор топика

Главная проблема сисколлов в том, что приходится переключаться из режима пользователя в режим ядра. Однако, надо учитывать, что не все функции libc внутри себя дёргают сисколлы (например, какому-нибудь strlen ядро нафиг не нужно, malloc дёргает сисколлы только когда хочет увеличить кучу процесса). В случае time, конечно, сисколл будет.

Но суть именно в том, что самая дорогая часть сисколла это переключение контекста. За некоторыми очевидными исключениями (когда сисколл изначально заточен на ожидание чего-либо, либо приводит к доступу к диску).

KivApple ★★★★★
()
Ответ на: комментарий от KivApple

я бы не задумывалась над проблемой сисколов, но у меня софт на конечных автоматах в 1 поток и будет работать только на одном ядре.
А вообще, если просто на пальцах прикинуть, то работа с мьютексами будет еще большим злом чем просто получение времени сисколом time(). Мьютекс это объект ядра и нужно его заполучить, выполнить чтение переменной, а потом еще и отпустить этот мьютекс

nyka
() автор топика
Ответ на: комментарий от nyka

Просто перед обработкой событий на сокетах сохранять текущее время, а при чтении/записи проставлять его, а не получать каждый раз вызововом time()

Nginx так делает. Только он ещё создаёт и строковое представление времени в разных форматах, чтобы и эту операцию не повторять каждый раз.

i-rinat ★★★★★
()
Ответ на: комментарий от nyka

mutex не обязательно должен быть объектом ядра. Чисто технически их можно реализовать на 90% в userspace, от ядра потребуются только сисколлы для усыпления-пробуждения потоков (чтобы не крутить зря циклы ожидания). При этом:

1) Захват свободного мьютекса и освобождение мьютекса, который никто не ждёт, может быть произведён без обращения к ядру (не надо ни засыпать самому при захвате, ни пытаться пробудить другие потоки при освобождении)

2) Некоторые реализации перед тем как уснуть в ожидании мьютекса крутят некоторое количество busy loop ожидания - на многоядерной системе это может оказаться выгоднее (поток на соседнем ядре освободит мьютекс быстрее, чем займут времени сисколлы усыпления и пробуждения).

Однако, конкретная реализация pthread может не использовать эти возможности. Тут я уже не знаю... Я только знаю, что снизить стоимость mutex можно.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от KivApple

Главная проблема сисколлов в том, что приходится переключаться из режима пользователя в режим ядра. Однако, надо учитывать, что не все функции libc внутри себя дёргают сисколлы (например, какому-нибудь strlen ядро нафиг не нужно, malloc дёргает сисколлы только когда хочет увеличить кучу процесса). В случае time, конечно, сисколл будет.

Но суть именно в том, что самая дорогая часть сисколла это переключение контекста. За некоторыми очевидными исключениями (когда сисколл изначально заточен на ожидание чего-либо, либо приводит к доступу к диску).

Есть ещё VDSO.

time() по идее реализован с помощью __vdso_time() и должен работать значительно быстрее, чем «полноценный» сисколл.

Deleted
()
Ответ на: комментарий от Deleted

time() по идее реализован с помощью __vdso_time() и должен работать значительно быстрее, чем «полноценный» сисколл.

Сделала гарантированно 1 вызов time() на цикл обработки событий на сокетах. При таких цифрах думать о реализации уже не имеет смысла

nyka
() автор топика
Ответ на: комментарий от KivApple

В линуксе в glibc так и сделано — сначала попытка поспинлочиться через атомарный CAS, потом сисколл futex() для блокировки.

Но да, с учетом vdso time будет работать даже быстрее пары циклов спинлока из мьютекса, не говоря уже о вызове futex(), который будет дёргать планировщик.

vzzo ★★★
()

мне одному кажется что этот велосипед уже давно превысил сложность буста ?

anonymous
()
Ответ на: комментарий от anonymous

мне одному кажется что этот велосипед уже давно превысил сложность буста ?

Про мой софт вцелом или сискол time()?

nyka
() автор топика

и регулярно проходится по массиву соединений в поисках тех которые нужно отвалить по таймауту.

this. оптимизируйте этот кусок, а не ловлю блох с таймером

MKuznetsov ★★★★★
()
Ответ на: комментарий от anonymous

один сискол не может сравниваться с бустом, конечно же про ваш софт в целом

Я уже прошлась по всем граблям что только можно, просто соглашусь с вами.

nyka
() автор топика
Ответ на: комментарий от MKuznetsov

this. оптимизируйте этот кусок, а не ловлю блох с таймером

Я еще не оптимизировала этот участок. Конечно же просто обход по массиву не оставлю и смотрю в сторону динамических структур из STL. К сожалению, я только недавно начала изучать C++ и вижу как много потеряла оставаясь на голом С.

nyka
() автор топика
Ответ на: комментарий от nyka

К сожалению, я только недавно начала изучать C++ и вижу как много потеряла оставаясь на голом С.

А как много ты потеряла не пиша на лиспохацкеле!

anonymous
()
Ответ на: комментарий от anonymous

А как много ты потеряла не пиша на лиспохацкеле!

Если отбросить сарказм, то я говорю о стоимости результата выраженной, как в минимум, в трудозатратах. Кто-то за 3 дня нафигачит то что я делаю уже 2 недели в режиме обучения. Это очень напрягает и на каждом этапе изчения вопроса говоришь сама себе «%*ть, да я же уже переписала этот участок за день, оказывается что тут можно проще и за час!»

nyka
() автор топика
Ответ на: комментарий от nyka

тут можно проще и за час!

на лиспохацкеле можно вообще ничего не писать, там уже всё есть.

anonymous
()
Ответ на: комментарий от anonymous

man vdso

закапывают его... не взлетел, что неудивительно. удивительно то, что понадобилось 10 лет чтобы дошло.

anonymous
()

Пришёл сюда, чтобы написать про vdso.

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.