2010-01-10 3 views
2

Я оцениваю производительность экспериментальной системы на 8-ядерном компьютере с 16 ГБ оперативной памяти. У меня есть две Java RDBMSs с основной памятью (hsqldb), и против каждого из них я запускаю клиент TPCC (полученный из jTPCC/BenchmarkSQL).Начальные процессы в то же время медленнее, чем ошеломляющие; Зачем?

У меня есть сценарии для запуска вещей, так, например, экземпляры HSQLDB начинаются с:

./hsqld.bash 0 & 
./hsqld.bash 1 & 

Если я начну клиентов почти в то же самое время:

./hsql-tpcc.bash 0 & 
./hsql-tpcc.bash 1 & 

, то каждый из этих клиентов имеет пичковый начальную скорость в пределах 500-1000 (это транзакций в минуту это в основном транзакции в минуту), затем быстро (менее чем за секунду) оседает до скорости 200-250 т/мин. Ото, если я подожду в течение секунды или два до начала второго клиента:

./hsql-tpcc.bash 0 & 
sleep 1 
./hsql-tpcc.bash 1 & 

то каждый из клиентов работает на 2500+ транзакций в минуту. Ожидание более чем на секунду не делает больше различий.

Это странно, потому что клиент 0 просто разговаривает с сервером 0, а клиент 1 просто разговаривает с сервером 1. Непонятно, почему возникает такое серьезное вмешательство в производительность.

Я думал, что это связано с близостью клиентов планировщика процессора, но при медленном запуске они занимают около 1-3% одного ядра (20-25% при быстром запуске). Еще одно подозрение было в привязках NUMA клиентов (конфликт памяти на том же узле памяти), но у машины, по-видимому, всего лишь 1 узел памяти (есть только/sys/devices/system/node/node0), и, кроме того, каждый клиент занимает всего 0,8% памяти.

Это также не связано с привязками ЦП для экземпляров hsqldb, так как быстрое и медленное поведение можно увидеть только путем перезапуска клиентов (и ожидания/не ожидая секунды), оставив те же самые экземпляры hsqldb (т.е. hsqldb не нужно перезапускать). hsqldb занимает 4-8% CPU, когда медленный, 80% -ный процессор при быстром и 4,3% памяти.

Любые другие идеи, почему это может произойти? Там нет дискового ввода-вывода, и я не близок к исчерпанию памяти системы. Заранее спасибо. Другая соответствующая информация следующим образом:

$ uname -a 
Linux hammer.csail.mit.edu 2.6.27.35-170.2.94.fc10.x86_64 #1 SMP Thu Oct 1 14:41:38 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux 
+0

Я хочу видеть ответ на этот вопрос. Твоя ситуация кажется мне довольно странной. Одна вещь, которую люди могут найти полезной, хотя ... Что такое вывод 'uname -a'? – Omnifarious

+2

* «Я не близок к исчерпанию памяти системы» * Но как насчет кэшей (в частности, процессор кэширует L1)? Производительность в реальном времени сильно зависит от использования кеша. – dmckee

+0

@dmckee: конфликт в кэше может быть проблемой; есть ли простой способ проверить это? – Yang

ответ

1

Как долго ваш «две основной памяти Java РСУБД (HSQLDB)» 's был запущен перед тестом? Если вы начнете их прямо перед тестом, попробуйте сначала разогреть их. Пусть горячая точка сделает это, и пропустите весь код if (first_time) { do_initialization(); } в db, чтобы сборщик мусора мог успокоиться.

Кроме того, начиная с двух вещей (независимо от того, что они есть) в то же время означает, что минимально оба пытаются одновременно выполнить всю свою работу с init (выделить память, выделить страницы в swap, найти и загрузить библиотеки и т. д.). Таким образом, обе программы тратят первые миллисекунды своей жизни на конфликт ввода-вывода.

+0

Я попытался перезапустить серверы hsqldb непосредственно перед запуском клиентов (т. Е. Они были запущены в течение почти 0 времени перед тестом), а также не перезапускать их между тестами (т. Е. Они запускались в течение многих минут до тест и прошли несколько тестов). Эти тесты работают как минимум на минуту, поэтому аномалия не связана с отсутствием времени прогрева. – Yang

Смежные вопросы