Мы запускаем игровое приложение .WAR на Tomcat 6 на сервере Amazon EC2, 8-ядерный процессор, 7 ГБ ОЗУ. Приложение использует базу данных MySQL, размещенную на Amazon RDS.
Это приложение Facebook требует времени для доступа, когда в него играют всего 20-30 пользователей. Большая разница от 1-2 пользователей. Весь .WAR составляет ~ 4 МБ, весь статический контент размещен в другом месте.
Сервер никогда не был близок к тому, чтобы исчерпать оперативную память. Загрузка процессора никогда не была выше 13,5-14%. Даже с ~ 500 пользователями это полностью остановило работу. Количество потоков или пулы потоков еще не исчерпаны. Я увеличил maxthreads, но это не дало заметной разницы.
Моя теория заключается в том, что Tomcat может использовать только одно ядро процессора, что объясняет, почему он был замедлен до полной остановки, хотя загрузка ЦП стабильно составляла 13-14% во время всплеска активности.
Но я изо всех сил пытаюсь понять, почему он будет использовать только одно ядро процессора. В server.xml нет ограничения процессора. Приложение содержит несколько сервлетов (4 или 5). В коде Java нет упоминания об SingleThreadModel.
ЧТО может вызывать очень медленную работу приложения? Если в приложении всего 1-5 человек, оно работает нормально. При 20-30 человек практически невозможно контактировать.
Это может быть недостаток в дизайне приложения. У нас также есть одно приложение, которое ведет себя так же. Значительная часть его кода синхронизирована, поэтому независимо от того, сколько процессоров мы ему даем, он эффективно работает в одном потоке. В этой ситуации вы почти ничего не можете сделать, кроме запуска нескольких экземпляров одного и того же приложения и балансировки нагрузки между ними.