23
23
import org .elasticsearch .indices .IndicesMemoryCleaner ;
24
24
import org .elasticsearch .monitor .memory .MemoryMonitor ;
25
25
import org .elasticsearch .threadpool .ThreadPool ;
26
- import org .elasticsearch .util .SizeUnit ;
27
- import org .elasticsearch .util .SizeValue ;
28
- import org .elasticsearch .util .StopWatch ;
29
- import org .elasticsearch .util .TimeValue ;
26
+ import org .elasticsearch .util .*;
30
27
import org .elasticsearch .util .component .AbstractLifecycleComponent ;
31
28
import org .elasticsearch .util .inject .Inject ;
32
29
import org .elasticsearch .util .settings .Settings ;
@@ -47,7 +44,7 @@ public class AlphaMemoryMonitor extends AbstractLifecycleComponent<MemoryMonitor
47
44
48
45
private final TimeValue interval ;
49
46
50
- private final int gcThreshold ;
47
+ private final int clearCacheThreshold ;
51
48
52
49
private final int cleanThreshold ;
53
50
@@ -68,7 +65,7 @@ public class AlphaMemoryMonitor extends AbstractLifecycleComponent<MemoryMonitor
68
65
private volatile ScheduledFuture scheduledFuture ;
69
66
70
67
private AtomicLong totalCleans = new AtomicLong ();
71
- private AtomicLong totalGCs = new AtomicLong ();
68
+ private AtomicLong totalClearCache = new AtomicLong ();
72
69
73
70
@ Inject public AlphaMemoryMonitor (Settings settings , ThreadPool threadPool , IndicesMemoryCleaner indicesMemoryCleaner ) {
74
71
super (settings );
@@ -78,12 +75,12 @@ public class AlphaMemoryMonitor extends AbstractLifecycleComponent<MemoryMonitor
78
75
this .upperMemoryThreshold = componentSettings .getAsDouble ("upper_memory_threshold" , 0.8 );
79
76
this .lowerMemoryThreshold = componentSettings .getAsDouble ("lower_memory_threshold" , 0.5 );
80
77
this .interval = componentSettings .getAsTime ("interval" , timeValueMillis (500 ));
81
- this .gcThreshold = componentSettings .getAsInt ("gc_threshold " , 5 );
78
+ this .clearCacheThreshold = componentSettings .getAsInt ("clear_cache_threshold " , 2 );
82
79
this .cleanThreshold = componentSettings .getAsInt ("clean_threshold" , 10 );
83
80
this .minimumFlushableSizeToClean = componentSettings .getAsSize ("minimum_flushable_size_to_clean" , new SizeValue (5 , SizeUnit .MB ));
84
81
this .translogNumberOfOperationsThreshold = componentSettings .getAsInt ("translog_number_of_operations_threshold" , 5000 );
85
82
86
- logger .debug ("interval[" + interval + "], upper_memory_threshold[" + upperMemoryThreshold + "], lower_memory_threshold[" + lowerMemoryThreshold + "], translog_number_of_operations_threshold[" + translogNumberOfOperationsThreshold + "]" );
83
+ logger .debug ("interval [" + interval + "], upper_memory_threshold [" + upperMemoryThreshold + "], lower_memory_threshold [" + lowerMemoryThreshold + "], translog_number_of_operations_threshold [" + translogNumberOfOperationsThreshold + "]" );
87
84
88
85
this .runtime = Runtime .getRuntime ();
89
86
this .maxMemory = new SizeValue (runtime .maxMemory ());
@@ -111,7 +108,7 @@ private long totalMemory() {
111
108
112
109
private class MemoryCleaner implements Runnable {
113
110
114
- private int gcCounter ;
111
+ private int clearCacheCounter ;
115
112
116
113
private boolean performedClean ;
117
114
@@ -120,12 +117,15 @@ private class MemoryCleaner implements Runnable {
120
117
private StopWatch stopWatch = new StopWatch ().keepTaskList (false );
121
118
122
119
@ Override public void run () {
120
+ // clear unreferenced in the cache
121
+ indicesMemoryCleaner .cacheClearUnreferenced ();
122
+
123
123
// try and clean translog based on a threshold, since we don't want to get a very large transaction log
124
- // which means recovery it will take a long time (since the target reindex all this data)
124
+ // which means recovery it will take a long time (since the target re-index all this data)
125
125
IndicesMemoryCleaner .TranslogCleanResult translogCleanResult = indicesMemoryCleaner .cleanTranslog (translogNumberOfOperationsThreshold );
126
126
if (translogCleanResult .cleanedShards () > 0 ) {
127
127
long totalClean = totalCleans .incrementAndGet ();
128
- logger .debug ("[" + totalClean + "] Translog Clean: " + translogCleanResult );
128
+ logger .debug ("[" + totalClean + "] [ Translog] " + translogCleanResult );
129
129
}
130
130
131
131
// the logic is simple, if the used memory is above the upper threshold, we need to clean
@@ -142,7 +142,7 @@ private class MemoryCleaner implements Runnable {
142
142
long upperThresholdMemory = (long ) (upperMemory * upperMemoryThreshold );
143
143
144
144
if (usedMemory - upperThresholdMemory <= 0 ) {
145
- gcCounter = 0 ;
145
+ clearCacheCounter = 0 ;
146
146
performedClean = false ;
147
147
cleanCounter = 0 ;
148
148
return ;
@@ -160,30 +160,31 @@ private class MemoryCleaner implements Runnable {
160
160
long memoryToClean = usedMemory - lowerThresholdMemory ;
161
161
if (logger .isDebugEnabled ()) {
162
162
StringBuilder sb = new StringBuilder ();
163
- sb .append ('[' ).append (totalClean ).append ("]: " );
164
- sb .append ("Cleaning, memoryToClean [" ).append (new SizeValue (memoryToClean )).append (']' );
165
- sb .append (", lowerMemoryThreshold [" ).append (new SizeValue (lowerThresholdMemory )).append (']' );
166
- sb .append (", upperMemoryThreshold [" ).append (new SizeValue (upperThresholdMemory )).append (']' );
167
- sb .append (", usedMemory [" ).append (new SizeValue (usedMemory )).append (']' );
168
- sb .append (", totalMemory [" ).append (new SizeValue (totalMemory )).append (']' );
169
- sb .append (", maxMemory [" ).append (maxMemory ).append (']' );
163
+ sb .append ('[' ).append (totalClean ).append ("] " );
164
+ sb .append ("[ Cleaning] memory_to_clean [" ).append (new SizeValue (memoryToClean )).append (']' );
165
+ sb .append (", lower_memory_threshold [" ).append (new SizeValue (lowerThresholdMemory )).append (']' );
166
+ sb .append (", upper_memory_threshold [" ).append (new SizeValue (upperThresholdMemory )).append (']' );
167
+ sb .append (", used_memory [" ).append (new SizeValue (usedMemory )).append (']' );
168
+ sb .append (", total_memory [" ).append (new SizeValue (totalMemory )).append (']' );
169
+ sb .append (", max_memory [" ).append (maxMemory ).append (']' );
170
170
logger .debug (sb .toString ());
171
171
}
172
172
173
173
IndicesMemoryCleaner .MemoryCleanResult memoryCleanResult = indicesMemoryCleaner .cleanMemory (memoryToClean , minimumFlushableSizeToClean );
174
174
if (logger .isDebugEnabled ()) {
175
- logger .debug ("[" + totalClean + "] Memory Clean: " + memoryCleanResult );
175
+ logger .debug ("[" + totalClean + "] [Cleaned ] " + memoryCleanResult );
176
176
}
177
- performedClean = true ;
178
- cleanCounter = 0 ;
179
177
180
- if (++gcCounter >= gcThreshold ) {
181
- long totalGc = totalGCs .incrementAndGet ();
182
- logger .debug ("[" + totalGc + "]: Running GC after [" + gcCounter + "] memory clean swipes" );
183
- System .gc ();
184
- gcCounter = 0 ;
178
+ if (++clearCacheCounter >= clearCacheThreshold ) {
179
+ long totalClear = totalClearCache .incrementAndGet ();
180
+ logger .debug ("[" + totalClear + "] [Cache ] cleared after [" + (cleanCounter / cleanThreshold ) + "] memory clean swipes" );
181
+ indicesMemoryCleaner .cacheClear ();
182
+ ThreadLocals .clearReferencesThreadLocals ();
183
+ clearCacheCounter = 0 ;
185
184
}
186
185
186
+ performedClean = true ;
187
+ cleanCounter = 0 ;
187
188
}
188
189
}
189
190
}
0 commit comments