I would recommend you to post the code of your singleton and ajax back-end. It's hard to make a statement saying that your singleton or ajax back-end is at fault if we are not able to look at it.
I would probably look at the number of connections as a more likely cause though. If this is not a local application it's not uncommon that the actual requests take more than 0.5s. So one request might not be done before you call another. This could over time build up a queue that the SQLi backend is not able to process fast enough and the process count would start to rise since new requests were added to the queue every 0.5s for each connected client.
How does the ajax back-end look? Does it run a query straight away? Does it launch another php instance? How many concurrent connection is the webserver and database configured for?
All these things will heavily determine how your application behaves. Also, as stated. Note that even if you use a singleton it does NOT live past the execution of your ajax call. Each time you make a call your php application starts from scratch and your singleton is created from scratch once again.
You could set up an application (written in PHP or other) that would actually run all the time and make use of a main loop. Then you could either make that listen to a specific socket or by other means have your ajax back-end pass data to that application. The running application could then handle the database back-end and return the data to the ajax back-end that would return the reply. This way the database handler would not recreate your singleton all the time. But you would very likely still run into queue issues if there are a lot of clients making requests that require a database look-up every 0.5s.
Good luck!