|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
Здравствуйте уважаемые форумчане! Помогите разобраться с архитектурой системы. Вариант 1 Имеется система тестирования знаний, которая делится на два интерфейса: web-интерфейс (для пользователей) и windows-приложение (для админа). Web-интерфейс работает на Apache+PHP. Каждый тест представляет отдельный файл, который является отдельной SQLite базой, а также есть общая база данных SQLite, где хранится общая информация (тесты, пользователи, результаты). При запуске пользователем тестирования, весь тест целиком загружается в сессию PHP (массив $_SESSION). Сами сессии хранятся в виде файлов. В процессе тестирования все данные читаются и пишутся в сессии, а после окончания тестирования сохраняются в базы SQLite. Кроме этого, каждый ответ пользователя фиксируется в SQLite и каждые 7 секунд каждый браузер JavaScript-ом посылает запрос, который пишет в общую базу информацию, которая нужна, чтобы проинформировать систему о своем присутствии, чтобы система знала, кто ещё жив, а кто отвалился (например, закрыл браузер). Результат использования: Уже при небольшом числе подключений (~10-20) на среднем компьютере возникла огромная нагрузка на процессор, память и жесткий диск. Задержки при переключении между вопросами стали недопустимо большими. После этого были внесены изменения: Вариант 2 Была убрана фиксация ответов пользователя в процессе тестирования в базу SQLite. Все данные сохраняются разом после завершения тестирования. Информационное сообщение браузерами теперь отправляется не каждые 7 секунд, а каждые 45 секунд. Фактически при запуске тестирования данные загружаются из SQLite в сессию PHP и затем вся работа идет только с этими сессиями, там хранится все (вопросы, варианты ответов, ответы). Результат использования: Большая нагрузка на жесткий диск, т.к. файлы сессий хранятся на жестком диске, и порой могут весить до 3 Мб. Причем каждый раз, когда пользователь дает ответ или переключается между вопросами, то вся сессия из файла загружается PHP в память, а затем пишется обратно в файл. Насилие жесткого диска огромно, а также он тянет за собой процессор, но там ещё допустимая нагрузка и память допустимо расходуется. Также имеется проблема когда несколько пользователей пишут в SQLite свои результаты. При работе из PHP проблема не заметна, т.к. там выстраивается очередь, а вот когда админ работает в Windows-интерфейсе, то у него могут возникать сообщения о том, что база заблокирована, т.к. SQLite на самом деле не подходит для многопользовательской работы! После этого были внесены изменения: Вариант 3 В качестве базы для хранения общих данных вместо SQLite была выбрана FireBird. Сессии PHP теперь журналируются в redis (кешируются в ОЗУ), а не хранятся на жестком диске. Результат использования: Нагрузка на жестак только при запуске тестирования и окончании (запросы в базы тестов SQLite). Общие данные теперь в FireBird поэтому проблем блокировок нет. Нагрузки на жесткий диск теперь нет, т.к. работает redis. Увеличился расход ОЗУ, но допустимо Т.е. система услажнилась от первоначального варианта. Было Apache+PHP+SQLite, теперь Apache+PHP+SQLite+FireBird+redis. При этом каждый тест остается в отдельном SQLite. Сделать приложение администратора с возможностью работать удаленно сложно. А такие требования возникли. Конечно можно извратиться и усложнить все ещё сильней. Но возникает мысль – Зачем все так было усложнять?! Может быть можно было использовать классическую схему, когда все всегда читается и пишется в клиент серверную СУБД FireBird или PostgreSQL. Но тогда будут постоянные SQL запросы на чтение и запись. Если хранить все только в одной БД на PostgreSQL? Каждый раз когда пользователь читает вопрос, то загружать его несколькими SELECT, а когда дает ответ делать UPDATE и не париться с этими SQLite, сессиями и т.д. Т.е. вопрос в следующем: Потянет ли самая классическая немудренная схема следующую максимальную нагрузку: 200 подключений, каждое из которых делает каждую секунду 2 запроса select (читает вопрос и варианты ответа) и 1 update (пишет ответ) на таблицы до 10000 записей. Компьютер средний 2-4 гига ОЗУ, средний процессор, HDD 7200 оборотов. Опытные администраторы СУБД скажите, пожалуйста, PostgreSQL или FireBird потянут 200 update-ов и 400 select-ов в секунду на такой машине или лучше оставить то извращение (сессии, redis), которое было сделано? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 16:33 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
execoma, только оракул. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 16:46 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
Надеюсь вы в курсе, что SQLite блокирует БД целиком на каждую пишущую транзакцию? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 16:47 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
Gluk (Kazan)Надеюсь вы в курсе, что SQLite блокирует БД целиком на каждую пишущую транзакцию? Поэтому ту БД, что многопользовательская мы заменили на FireBird. Но систему теперь сложно развивать, тесты хранятся в отдельных SQLite, результаты тестирования тоже в отдельных SQLite, а общая база FireBird. Все разрозненно. Ещё намудрили с этими сессиями. Хотя тут не ясно, т.к. может и правильно сделали, т.к. нагрузки в процессе тестирования на жесткий диск вообще нет! Но зато память жрется. Мы хотим сделать, чтобы админ мог через Windows-приложение коннектица к БД удаленно. С общей базой нет проблем (FireBird), а то, что каждый тест в отдельной SQLite - тут сложности, т.к. нужно удаленно передавать весь файл, а потом его возвращать. Для нужно какое-то средство самому писать, либо задействовать Apache и PHP. Поэтому возникла мысль, что мы ну слишком все усложням, т.к. при классической схеме таких проблем вообще бы не было, одна база и все на мази, но может по нагрузке все провалилось бы ... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 17:01 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
execoma, сколько у вас клиентов? Объем данных, число запросов в секунду? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 17:17 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
BlackEricexecoma, сколько у вас клиентов? Объем данных, число запросов в секунду? Как я писал, система должна работать, при максимальной нагрузке: 200 активнейший подключений - каждое 2 select и 1 update в 1-2 секунды на таблицы до 10000 записей - и это в процессе тестирования, т.к. при запуске тестов возникает вообще множество select-ов, а по окончанию множество insert-ов и update-ов. Я не знаю, вообще тут возможно дать ответ на мой вопрос, скорее всего нужно проводить испытания. Я просто подумал, что может у кого-нибудь уже есть опыт, который позволяет оценить производительность клиент-серверных СУБД на обычных ПК, и сможет дать ответ на вопрос - (не)потянет. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 17:26 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
execoma, На FB должна потянуть. Хотя в итоге все будет зависеть от структуры таблиц, сложности запросов и правильности индексов ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 17:29 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
execomaПоэтому возникла мысль, что мы ну слишком все усложням, т.к. при классической схеме таких проблем вообще бы не было, одна база и все на мази, но может по нагрузке все провалилось бы ... С чего бы? Ни у кого не валится ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 17:32 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
execomaПотянет ли самая классическая немудренная схема следующую максимальную нагрузку: 200 подключений, каждое из которых делает каждую секунду 2 запроса select (читает вопрос и варианты ответа) и 1 update (пишет ответ) на таблицы до 10000 записей. Компьютер средний 2-4 гига ОЗУ , средний процессор, HDD 7200 оборотов. Опытные администраторы СУБД скажите, пожалуйста, PostgreSQL или FireBird потянут 200 update-ов и 400 select-ов в секунду на такой машинеЕсли эти 400 селектов не являются "тяжелыми выборками всего на свете", то Firebird потянет. Но только как SuperClassic (начиная с 2.5), ибо памяти мало совсем. Также не забудьте сразу увеличить в firebird.conf\'e значение DefaultDBCachePages до 512 или даже 1024. При числе подключений 200 и размере страницы в 8К общий кеш займёт 838 Мб или 1.66 Гб соотв-но. Также задайте в firebird.conf значения для параметров MaxUnflushedWrites = -1 и MaxUnflushedWriteTime = -1 (чтобы запись на диск не стала узким местом). Ознакомьтесь с тестами: раз , два, три. Ну и сами попробуйте потестировать на своём железе - это надёжнее всего. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 19:39 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
авторПри запуске пользователем тестирования, весь тест целиком загружается в сессию PHP (массив $_SESSION). авторкаждые 7 секунд каждый браузер JavaScript-ом рыдалЪ. налицо полное непонимание работы php. Бери ужо Memcached DB и не парься. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 21:37 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
а, еще mongobd можно. оно тоже все в памяти держит. а по хорошему меняй архитектуру. на каждый аякс запрос подсасывать только в сессию по 3 метра - это жесть. вали то что не нужно в каждом чихе в память/файлы и читай оттуда по мере надобности. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.11.2011, 21:40 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
Таблоид, спасибо за ценную информацию! ScareCrowавторПри запуске пользователем тестирования, весь тест целиком загружается в сессию PHP (массив $_SESSION). авторкаждые 7 секунд каждый браузер JavaScript-ом рыдалЪ. налицо полное непонимание работы php. Бери ужо Memcached DB и не парься. А что там может быть не понятного? А Memcached это гамно. Memcached не позволяет загружать большие объекты (вроде больше метра, т.к. у них какие-то сложности с индексами возникли) и ещё к тому же падает при большой нагрузке и сильном расходе памяти теряя все данные без возможности восстановления. А также когда ему не хватает памяти, то он начинает удалять наиболее старые данные, а тут ничего удалять нельзя. Все это проверенно как раз на этой системе. У redisa пока такого не было замечено, тем более он умеет сливать данные на хард (например, регулярно по времени) и после сбоя их восстанавливает. ScareCrowа, еще mongobd можно. оно тоже все в памяти держит. а по хорошему меняй архитектуру. на каждый аякс запрос подсасывать только в сессию по 3 метра - это жесть. вали то что не нужно в каждом чихе в память/файлы и читай оттуда по мере надобности. Хочется, чтобы все хранилось красиво в одном месте одной базе, а не в куче баз двух разных СУБД, сессиях, кеше и т.д. Т.к. проект невозможно развивать дальше, наращивать функционал и т.д. Поэтому и возникли такие вопросы.. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2011, 00:06 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
Cудя по описанию, узкое место - php, используемый в не подходящем для него режиме. Переход к многопользовательской СУБД и минимизация запрашиваемого "на каждое движение пользователя" должны значительно улучшить дело, но, возможно, стоит не реанимировать труп, а отказаться от архитектуры, требующей "загрузки по запросу". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2011, 12:13 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
ТаблоидНо только как SuperClassic (начиная с 2.5), ибо памяти мало совсем. можно попробовать применить db pool если запросы легкие, это может дать результат ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2011, 15:02 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
alex_kТаблоидНо только как SuperClassic (начиная с 2.5), ибо памяти мало совсем. можно попробовать применить db pool если запросы легкие, это может дать результат Это какая-то firebird-ная фича, что-то типа pg pool II для PostgreSQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2011, 15:10 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
фича, нет, я имел в виду архитектуру в общем. не держать на каждого пользователя соединение, а брать для каждой транзакции свободное соединение из общей кучи соединений, а затем освобождать его. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.11.2011, 15:55 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
фичаЭто какая-то firebird-ная фича это фича php. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 00:40 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
kdvфичаЭто какая-то firebird-ная фича это фича php. Хм, чето и в php такой фичи не знаю. Есть отдельные модули подобные под php, но знаю только socket handler под mysql. А как такой под Firebird называется? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 00:50 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
авторMemcached не позволяет загружать большие объекты (вроде больше метра, т.к. у них какие-то сложности с индексами возникли) и ещё к тому же падает при большой нагрузке и сильном расходе памяти теряя все данные без возможности восстановления. А также когда ему не хватает памяти, то он начинает удалять наиболее старые данные количество граблей позволяет сказать что это клиника. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 02:14 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
фичаХм, чето и в php такой фичи не знаю. вы тогда ничего о php не знаете. пул в p_connect, как минимум http://www.php.net/manual/en/features.persistent-connections.php ... |
|||
:
Нравится:
Не нравится:
|
|||
14.11.2011, 02:21 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
kdvфичаХм, чето и в php такой фичи не знаю. вы тогда ничего о php не знаете. пул в p_connect, как минимум http://www.php.net/manual/en/features.persistent-connections.php Кстати, пул в p_connect http://www.php.net/manual/en/features.persistent-connections.php работает только под FastCGI-PHP или так же под mod_php? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2011, 12:31 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
execomaЗдравствуйте уважаемые форумчане! Помогите разобраться с архитектурой системы. Вариант 1 Очень плохо. execoma Вариант 2 Очень плохо. execoma Вариант 3 Все равно очень плохо. 1) Избавиться от SQLite совсем. 2) Перепроектировать архитектуру БД и приложения С указанной нагрузкой справиться любая БД как Firebird, так и PostgreSQL ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2011, 13:08 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
А я знаю точно что очень многое зависит не от конкретной СУБД, а от навыков разработчика... надобы понять сначало почему у ТСа возникли столь большие нагрузки - а потом искать\советовать решение проблемы... ps На мой взгляд с задачей SQL Express справится в легкую - ток писать запросы надо хорошо :) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2011, 08:49 |
|
Вопрос архитектуры. Потянет ли СУБД нагрузку?
|
|||
---|---|---|---|
#18+
SanyLА я знаю точно что очень многое зависит не от конкретной СУБД, а от навыков разработчика... надобы понять сначало почему у ТСа возникли столь большие нагрузки - а потом искать\советовать решение проблемы... Проблемы у ТС возниклы из-за не правильного подбора инструментов для работы. Сам на это натолкнулся, когда разрабатывали веб-приложение на FoxPro. Можно и даже можно использовать DBF, но работает все это мягко скажем не лучшим образом. SanyLps На мой взгляд с задачей SQL Express справится в легкую - ток писать запросы надо хорошо :) Думаю использовать SQLite где либо кроме как в однопользовательских приложениях не эффективно. Можно, но есть шанс нарваться на трудно преодолимые ограничения платформы. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.11.2011, 13:17 |
|
|
start [/forum/topic.php?fid=35&msg=37522606&tid=1552620]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
45ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
50ms |
get tp. blocked users: |
1ms |
others: | 239ms |
total: | 379ms |
0 / 0 |