@@ -19,6 +19,7 @@ import git4idea.config.GitVcsApplicationSettings
19
19
import io.gitpod.gitpodprotocol.api.GitpodClient
20
20
import io.gitpod.gitpodprotocol.api.GitpodServerLauncher
21
21
import io.gitpod.jetbrains.remote.services.HeartbeatService
22
+ import io.gitpod.jetbrains.remote.utils.LatencyRecord
22
23
import io.gitpod.jetbrains.remote.utils.Retrier.retry
23
24
import io.gitpod.supervisor.api.*
24
25
import io.gitpod.supervisor.api.Info.WorkspaceInfoResponse
@@ -38,11 +39,14 @@ import java.net.URI
38
39
import java.net.http.HttpClient
39
40
import java.net.http.HttpRequest
40
41
import java.net.http.HttpResponse
42
+ import java.nio.file.Files
43
+ import java.nio.file.Paths
41
44
import java.time.Duration
42
45
import java.util.concurrent.CancellationException
43
46
import java.util.concurrent.CompletableFuture
44
47
import javax.websocket.DeploymentException
45
48
49
+
46
50
@Service
47
51
class GitpodManager : Disposable {
48
52
@@ -59,6 +63,35 @@ class GitpodManager : Disposable {
59
63
lifetime.terminate()
60
64
}
61
65
66
+ private val memProfileMode = System .getenv(" JB_MEM_PROFILE" ).toBoolean()
67
+
68
+ init {
69
+ val memProfileJob = GlobalScope .launch {
70
+ if (application.isHeadlessEnvironment || ! memProfileMode) {
71
+ return @launch
72
+ }
73
+ Files .newBufferedWriter(Paths .get(" /tmp/jb_mem_profile.log" )).use { writer ->
74
+ writer.write(" " )
75
+ writer.flush()
76
+ val allocatedRecord = LatencyRecord ()
77
+ val usedRecord = LatencyRecord ()
78
+ while (isActive) {
79
+ val totalMemory = Runtime .getRuntime().totalMemory() / (1024 * 1024 )
80
+ val usedMemory = (Runtime .getRuntime().totalMemory() - Runtime .getRuntime().freeMemory()) / (1024 * 1024 )
81
+ allocatedRecord.update(totalMemory)
82
+ usedRecord.update(usedMemory)
83
+ writer.write(" allocated - current ${totalMemory} M, avg ${allocatedRecord.averageLatency} M, max ${allocatedRecord.maxLatency} M, 90% percentile ${allocatedRecord.percentile(
84
+ 90 )} M\n " )
85
+ writer.write(" used - current ${usedMemory} M,avg ${usedRecord.averageLatency} M, max ${usedRecord.maxLatency} M, 90% percentile ${usedRecord.percentile(
86
+ 90 )} M\n " )
87
+ writer.flush()
88
+ delay(1000 )
89
+ }
90
+ }
91
+ }
92
+ lifetime.onTerminationOrNow { memProfileJob.cancel() }
93
+ }
94
+
62
95
init {
63
96
GlobalScope .launch {
64
97
if (application.isHeadlessEnvironment) {
@@ -269,4 +302,4 @@ class GitpodManager : Disposable {
269
302
serverJob.cancel()
270
303
}
271
304
}
272
- }
305
+ }
0 commit comments