В книгах пишут, что sysenter был внедрён из-за проблем со скоростью выполнения int 0x80 на Pentium 4. И вдруг обнаруживаю, что FreePascal не обнаруживает данной фичи в 028stab067.4 Начинаю сканировать исходники ядра и оказвается, что возможность SEP (смотрим флаг SEP в /proc/cpuinfo)сбрасывается при наличии exec-shield (которая включена по умолчанию). Ладно. Грузимся с параметром exec-shield=0 и в /proc/cpuinfo появляется флаг sep. Прекрасно. Однако возникает вопрос: а как же со скоростью? Нынешние процесооры уже не имеют проблем с int 0x80 и sysenter как бы уже не нужен? А если нужен, то какого рожна меня молчком тормозят как бы в моё же благо? Второе замечание: всегда считал, что в /proc/cpuinfo отображаются рельные возможности процессора. А полчучается, что там часть флагов сброшена (а вот PAE присутствует, хотя моё ядро и не использует этот режим). Бардак, однако... Но и после появления SEP во флагах, FreePascal не обнаруживает точку входа в sysenter. glibc он не использует и ищет данные в ElfAuxilaryVector (его ядро формирует по аналогии с enviroment).И там нет данныз о sysenter. Если дать ldd на бинарник ldd /bin/sh linux-gate.so.1 => (0xffffe000) libdl.so.2 => /lib/libdl.so.2 (0xb7fb2000) libc.so.6 => /lib/libc.so.6 (0xb7e7c000) /lib/ld-linux.so.2 (0xb7fba000) (пример из интернет для рабочего sysenter) то этого linux-gate.so не выдаётся. Вопрос: как у нас на сегодняшний день ситуация с sysenter? ПросвЯтите пожалуйста...
Как оказалось, если выполнить echo 1 > /proc/sys/fs/vsyscall то всё начинает работать. Если посмотреть на исходники для других архитектур, то там sysenter включается по умолчанию (смотрим linux/include/asm.../elf.h на предмет AT_SYSINFO).Например всё по умолчанию включено для ia64, powerpc. Иинтересно, что если смотреть исходники, то там sysctl_at_vsyscall в единице. Однако после загрузки в /proc/sys/fs/vsyscall видим 0 (этот файл вроде бы и отображает состояние sysctl_at_vsyscall). Глупая ситуация. PS: будет время, замерю количество вызовов gettimeofday за единицу времени в состоянии по умолчанию и в состоянии с разрешённым sysenter (то есть на сколько тормозят по умолчанию всех тех, кто не пользуется фирменным дистрибутивом).
Дошли руки до замеров. И странная картина получилась: на ядре 2.4.32 и Pentium III 800 MHz один syscall занимает 0.6 мкс на ядре 2.4.32 и AMD-K6-III 400 MHz один syscall занимает 1.0 мкс на ядре 2.6.18ovz и Celeron 1000 MHz один syscall занимает 1.5 мкс на ядре 2.6.18ovz и AtomN270 1600 MHz один syscall занимает 1.5 мкс Два последних случая -- при включенном vsyscall (sysenter). Если выключить, то будет чуть помедленнее -- 1.7 мкс. Проверка проводилась измерением времени одного миллиона вызовов gettimeofday(). Ядро 2.6.18ovz -- последнее из серии rhel5. Завтра попробую это ядро на первых двух машинах. Наверно надо проверить и чистое ядро 2.6.18. Что-то уж большая разница: в три раза
Про Celeron 1000 MHz наврал -- при включенном sysenter время одного syscall 0.8 мкс. А вот про N270 (Atom) 1600 MHz -- всё верно. У того что int 0x80, что sysenter - всё равно один syscall занимает 1.5 мкс. И это ещё хорошо. Старый Celeron 1700 MHz c syseneter тоже 1.5 мкс выдаёт, а при int 0x80 вообще 2.2 мкс. Вывод: дует Intel (вместе с ЦРУ) нашего брата. Вроде частоту прибавляет, а реально - тормозит. И хвалёный sysenter не помогает. Старый AMD-K-III 400 MHz за секунду больше системных вызовов выполнит, чем современные 1600 MHz Да, вопрос: exec-shield -- это стандартная фича или чья? Кто додумался включить её по умолчанию?
seyko2 wrote on Tue, 16 March 2010 16:32 Про Celeron 1000 MHz наврал -- при включенном sysenter время одного syscall 0.8 мкс. А вот про N270 (Atom) 1600 MHz -- всё верно. У того что int 0x80, что sysenter - всё равно один syscall занимает 1.5 мкс. И это ещё хорошо. Старый Celeron 1700 MHz c syseneter тоже 1.5 мкс выдаёт, а при int 0x80 вообще 2.2 мкс. Вывод: дует Intel (вместе с ЦРУ) нашего брата. Вроде частоту прибавляет, а реально - тормозит. И хвалёный sysenter не помогает. Старый AMD-K-III 400 MHz за секунду больше системных вызовов выполнит, чем современные 1600 MHz Да, вопрос: exec-shield -- это стандартная фича или чья? Кто додумался включить её по умолчанию? Я так полагаю, вопрос не по OpenVZ. А по RHEL kernel и направлять его надо в Red Hat bugzilla. Так как OpenVZ все же меняет ядро, но не до такой же степени