Ik ben al een paar dagen bezig met het optimaliseren van een een aantal classes van me die over een socket met een MySQL server praten. Ik loop tegen een "probleem" aan in de vorm van onnodige wachttijd bij het uitlezen van een reactie van de MySQL server.
Ik gebruik een Socket, met een BufferedInputStream om de inputstream van deze socket. Mijn java code is efficient m.b.t. method calls voor het uitlezen van response packets: ik lees een return header uit, die de lengte van de payload bevat, en lees vervolgens de rest van het packet in een keer.
Soms duurt het een aantal ms voordat ik een reactie heb. Wat andere data: de belasting van de machine is miniem, ook als ik mijn test prog draai. Mijn classes draaien op dezelfde machine als de MySQL server.
java -Xprof ... op een test class van me die een aantal updates verzend naar MySQL (dezelfde update query, behoort aan de MySQL kant dus snel afgehandeld te worden). Een packet dat een SQL UPDATE query bevat, resulteert in een enkel return packet dat uitgelezen moet worden.
profiler output:
Zijn er zaken die ik over het hoofd zie, of instellingen waar ik eens naar moet kijken?
Ik heb al gespeeld met de input en output buffer op het socket, zonder veel verschil. Heb ook al gekeken naar TCP_NODELAY, zonder al te veel resultaat.
Aangezien de packets die ik verzend evenredig zijn aan de packets die ik ontvang, vind ik het vreemd dat java.io.FileInputStream.readBytes er zo gigantisch uitschiet.
Ik gebruik een Socket, met een BufferedInputStream om de inputstream van deze socket. Mijn java code is efficient m.b.t. method calls voor het uitlezen van response packets: ik lees een return header uit, die de lengte van de payload bevat, en lees vervolgens de rest van het packet in een keer.
Soms duurt het een aantal ms voordat ik een reactie heb. Wat andere data: de belasting van de machine is miniem, ook als ik mijn test prog draai. Mijn classes draaien op dezelfde machine als de MySQL server.
java -Xprof ... op een test class van me die een aantal updates verzend naar MySQL (dezelfde update query, behoort aan de MySQL kant dus snel afgehandeld te worden). Een packet dat een SQL UPDATE query bevat, resulteert in een enkel return packet dat uitgelezen moet worden.
profiler output:
code:
1
2
3
| 79.7% 0 + 204 java.io.FileInputStream.readBytes 15.6% 0 + 40 java.net.SocketInputStream.socketRead0 0.8% 0 + 2 java.net.PlainSocketImpl.socketConnect |
Zijn er zaken die ik over het hoofd zie, of instellingen waar ik eens naar moet kijken?
Ik heb al gespeeld met de input en output buffer op het socket, zonder veel verschil. Heb ook al gekeken naar TCP_NODELAY, zonder al te veel resultaat.
Aangezien de packets die ik verzend evenredig zijn aan de packets die ik ontvang, vind ik het vreemd dat java.io.FileInputStream.readBytes er zo gigantisch uitschiet.