Я бы порекомендовал вам опубликовать код вашего синглтона и бэкэнда ajax. Трудно сделать заявление о том, что ваш синглтон или AJAX-сервер виноват, если мы не можем на это взглянуть.
Возможно, я бы посчитал количество соединений более вероятной причиной. Если это не локальное приложение, то весьма часто фактические запросы занимают более 0,5 с. Таким образом, один запрос может быть не выполнен до того, как вы позвоните другому. Это может со временем создать очередь, которую сервер SQLi не сможет обработать достаточно быстро, и число процессов начнет расти, поскольку новые запросы добавляются в очередь каждые 0,5 с для каждого подключенного клиента.
Как выглядит серверная часть Ajax? Запускает ли он запрос сразу? Это запускает другой экземпляр PHP? Для скольких одновременных соединений настроены веб-сервер и база данных?
Все эти вещи в значительной степени будут определять поведение вашего приложения. Также как заявлено. Обратите внимание, что даже если вы используете синглтон, он НЕ доживает после выполнения вашего вызова ajax. Каждый раз, когда вы звоните, ваше php-приложение запускается с нуля, а ваш синглтон снова создается с нуля.
Вы можете настроить приложение (написанное на PHP или другом), которое будет фактически работать постоянно и использовать основной цикл. Затем вы можете либо заставить прослушивать определенный сокет, либо другим способом передать свои данные ajax-бэкэнду в это приложение. Затем работающее приложение может обработать серверную часть базы данных и вернуть данные в серверную часть ajax, которая будет возвращать ответ. Таким образом, обработчик базы данных не будет воссоздавать ваш синглтон все время. Но вы, скорее всего, все равно столкнетесь с проблемами в очереди, если множество клиентов будут отправлять запросы, требующие просмотра базы данных каждые 0,5 с.
Удачи!