Hello All
We have a web-socket server that uses an SSL connection for the clients. We were contacted by one of our customers informing us that the server was not working any more.
We looked at the server and it was not accepting any connections, and the existing connections had died. We started to investigate and built a test app that makes a connection to a ping class on on the server, once it has a connection, it disconnects and make the connection again. It will repeat this process forever unless you stop it. I have attached the test_ping app.
The problem we now face is that we are not sure what is causing the memory to keep growing. I have used visual VM on the server and all the threads being created are being release. We stripped down the ping class to its bare bones, here it is.
This is the command to start the server:
java -Xms32M -Xmx64M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XXarallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=30 -jar ies_svr_aspect_hello.jar
Java Version :
1.8 1.8.0_202 http://java.sun.com/products/autodl/j2se C:\Program Files\Java\jre1.8.0_202\bin\javaw.exe true x86_64
Machine:
View attachment 77242
Main in the server app is as follows:
The server uses keystore so if anyone want to assist in helping you will need the same setup. As I said before we do not know why this is happening and I would like to hear from other who may have had this problem, or who have a production deployed solution similar to this but do not have this issue.
I will be back online Sunday 10th to work on this.
Regards
John.
We have a web-socket server that uses an SSL connection for the clients. We were contacted by one of our customers informing us that the server was not working any more.
We looked at the server and it was not accepting any connections, and the existing connections had died. We started to investigate and built a test app that makes a connection to a ping class on on the server, once it has a connection, it disconnects and make the connection again. It will repeat this process forever unless you stop it. I have attached the test_ping app.
The problem we now face is that we are not sure what is causing the memory to keep growing. I have used visual VM on the server and all the threads being created are being release. We stripped down the ping class to its bare bones, here it is.
B4X:
'WebSocket class
Sub Class_Globals
Private ws As WebSocket
End Sub
Public Sub Initialize
End Sub
Private Sub WebSocket_Connected (WebSocket1 As WebSocket)
ws = WebSocket1
ws.Session.MaxInactiveInterval = 30
End Sub
Private Sub WebSocket_Disconnected
log("WebSocket_Disconnected")
End Sub
This is the command to start the server:
java -Xms32M -Xmx64M -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XXarallelGCThreads=20 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=30 -jar ies_svr_aspect_hello.jar
Java Version :
1.8 1.8.0_202 http://java.sun.com/products/autodl/j2se C:\Program Files\Java\jre1.8.0_202\bin\javaw.exe true x86_64
Machine:
View attachment 77242
Main in the server app is as follows:
B4X:
'Non-UI application (console / server application)
' Version 1.0.0.8
#Region Project Attributes
#CommandLineArgs:
#AdditionalJar: mssql-jdbc-6.2.2.jre8.jar
#AdditionalJar: conscrypt-openjdk-uber-1.1.2.jar
#AdditionalJar: bcprov-jdk15on-159.jar
#End Region
Sub Process_Globals
Public DB_SQL As ConnectionPool
Public srvr As Server
Public svrConsole As ServerSocket
' // Global Map holding the settings
Public SettingsMap As Map
' // Define the settings file which is read by the global settings map
Public SettingsFile As String = "ies_svr_aspect_hello.ini"
Public appPath As String
Public logPath As String
Private logStream As OutputStream
End Sub
Sub AppStart (Args() As String)
Dim res As Int
Try
appPath = mod_settings.get_app_path
logPath = mod_settings.get_log_path
mod_settings.load_settings
writelog("AppStart, Version 1.0.0.8")
' // setup the SQL server
res = ConfigureSQL
If res > 0 Then
ExitApplication2(res)
End If
' // configure websocket
srvr.Initialize("")
srvr.AddWebSocket("/ping", "ping")
res = ConfigureSSL(SettingsMap.Get("ssl_port"))
If res > 0 Then
ExitApplication2(res)
End If
srvr.Port = SettingsMap.Get("http_port")
srvr.Http2Enabled = True
srvr.Start
' // start the message loop
StartMessageLoop
Catch
writelog("Error " & LastException.Message)
ExitApplication2(999)
End Try
End Sub
private Sub ConfigureSQL As Int
Dim res As Int = 0
Try
DB_SQL.Initialize("com.microsoft.sqlserver.jdbc.SQLServerDriver","jdbc:sqlserver:" & _
SettingsMap.Get("sql_host"), _
mod_security.decrypt(SettingsMap.Get("sql_usr")), _
mod_security.decrypt(SettingsMap.Get("sql_pwd")))
If Not(DB_SQL.IsInitialized) Then
res = 1
writelog("ConfigureSQL() error - " & SettingsMap.Get("sql_host") & ", Not Initialized")
writelog("ConfigureSQL() error - " & LastException.Message)
Else
writelog("ConfigureSQL() SQL IsInitialized = " & DB_SQL.IsInitialized)
End If
' // set the connection pool size
Dim jo As JavaObject = DB_SQL
Dim pool As Int = SettingsMap.Get("sql_pool")
writelog("AppStart pool = " & pool)
jo.RunMethod("setMaxPoolSize", Array(pool))
Catch
writelog("ConfigureSQL() error - " & LastException.message)
res = 1
End Try
Return res
End Sub
Private Sub ConfigureSSL (SslPort As Int) As Int
Dim res As Int = 0
Try
' // SSL connector configuration
Dim ssl As SslConfiguration
ssl.Initialize
ssl.SetKeyStorePath(File.GetFileParent(SettingsMap.Get("keystore")) , File.GetName(SettingsMap.Get("keystore")))
ssl.KeyStorePassword = mod_security.decrypt(SettingsMap.Get("ssl_pwd"))
ssl.KeyManagerPassword = mod_security.decrypt(SettingsMap.Get("ssl_pwd"))
ssl.EnableConscryptProvider
srvr.SetSslConfiguration(ssl, SslPort)
writelog("ConfigureSSL() " & SslPort & ", Configured")
Catch
res = 2
writelog("ConfigureSSL() " & SslPort & ", Error - " & LastException.Message)
End Try
Return res
End Sub
Sub writelog(pData As String)
DateTime.DateFormat = "yyyy-MM-dd"
DateTime.TimeFormat = "HH:mm:ss.SSS"
RedirectOutput(logPath,"ies_svr_aspect_hello.log")
If File.Size(logPath,"ies_svr_aspect_hello.log") > ((1024*1024)*10) Then
logStream.Close
' // remove existing backup
If File.Exists(logPath,"ies_svr_aspect_ptt_prev10mb.log") Then
File.Delete(logPath,"ies_svr_aspect_ptt_prev10mb.log")
End If
' // make new backup
File.Copy(logPath,"ies_svr_aspect_hello.log",logPath,"ies_svr_aspect_hello_prev10mb.log")
' // delete current log
File.Delete(logPath,"ies_svr_aspect_hello.log")
RedirectOutput(logPath,"ies_svr_aspect_hello.log")
End If
Dim logString As String
Dim Data() As Byte
logString = DateTime.date(DateTime.Now) & " " & DateTime.Time(DateTime.Now) & _
" " & pData & CRLF
Data = logString.GetBytes("UTF8")
logStream.WriteBytes(Data,0,Data.Length)
logStream.Flush
logStream.Close
Log(logString)
End Sub
Sub RedirectOutput (Dir As String, FileName As String)
logStream = File.OpenOutput(Dir,FileName,True)
End Sub
The server uses keystore so if anyone want to assist in helping you will need the same setup. As I said before we do not know why this is happening and I would like to hear from other who may have had this problem, or who have a production deployed solution similar to this but do not have this issue.
I will be back online Sunday 10th to work on this.
Regards
John.
Last edited: