diff --git a/workspace-gateway/src/main/java/com/aliware/tianchi/CallbackListenerImpl.java b/workspace-gateway/src/main/java/com/aliware/tianchi/CallbackListenerImpl.java
index f4113b4edbb88f0c3b8fc9341f780d4b21537d16..f80022abf281df2f5726c4abd06881cf30d74e07 100644
--- a/workspace-gateway/src/main/java/com/aliware/tianchi/CallbackListenerImpl.java
+++ b/workspace-gateway/src/main/java/com/aliware/tianchi/CallbackListenerImpl.java
@@ -17,4 +17,6 @@ public class CallbackListenerImpl implements CallbackListener {
         System.out.println("receive msg from server :" + msg);
     }
 
+    private String cachedServerCpu;
+
 }
diff --git a/workspace-provider/src/main/java/com/aliware/tianchi/CallbackServiceImpl.java b/workspace-provider/src/main/java/com/aliware/tianchi/CallbackServiceImpl.java
index fc9a2a9485f904e25222f5d820c826c537ebc1c3..796fd1c2bcf790dadf7b2794328e5954aa68b018 100644
--- a/workspace-provider/src/main/java/com/aliware/tianchi/CallbackServiceImpl.java
+++ b/workspace-provider/src/main/java/com/aliware/tianchi/CallbackServiceImpl.java
@@ -3,11 +3,14 @@ package com.aliware.tianchi;
 import org.apache.dubbo.rpc.listener.CallbackListener;
 import org.apache.dubbo.rpc.service.CallbackService;
 
-import java.util.Date;
-import java.util.Map;
-import java.util.Timer;
-import java.util.TimerTask;
+import javax.management.Attribute;
+import javax.management.AttributeList;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
+import java.lang.management.ManagementFactory;
+import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
 
 /**
  * @author daofeng.xjf
@@ -23,9 +26,10 @@ public class CallbackServiceImpl implements CallbackService {
             @Override
             public void run() {
                 if (!listeners.isEmpty()) {
+                    String messageToPush = generateStatusMessage();
                     for (Map.Entry<String, CallbackListener> entry : listeners.entrySet()) {
                         try {
-                            entry.getValue().receiveServerMsg(System.getProperty("quota") + " " + new Date().toString());
+                            entry.getValue().receiveServerMsg(messageToPush);
                         } catch (Throwable t1) {
                             listeners.remove(entry.getKey());
                         }
@@ -37,6 +41,20 @@ public class CallbackServiceImpl implements CallbackService {
 
     private Timer timer = new Timer();
 
+    private String generateStatusMessage() {
+        try {
+            List<String> cpuLoadList = getProcessCpuLoad().stream().map(Object::toString).collect(Collectors.toList());
+            String cpuLoadString = String.join(",", cpuLoadList);
+            System.out.println("Server push " + cpuLoadString);
+            return "cpu=" + cpuLoadString;
+        }
+        catch(Exception ex) {
+            return "error";
+
+        }
+
+    }
+
     /**
      * key: listener type
      * value: callback listener
@@ -45,7 +63,30 @@ public class CallbackServiceImpl implements CallbackService {
 
     @Override
     public void addListener(String key, CallbackListener listener) {
+        System.out.println("Server: add Listener " + key);
         listeners.put(key, listener);
         listener.receiveServerMsg(new Date().toString()); // send notification for change
     }
+
+    // System status impl
+    private static List<Double> getProcessCpuLoad() throws Exception {
+        List<Double> result = new ArrayList<>();
+
+        MBeanServer mbs    = ManagementFactory.getPlatformMBeanServer();
+        ObjectName name    = ObjectName.getInstance("java.lang:type=OperatingSystem");
+        AttributeList list = mbs.getAttributes(name, new String[]{ "ProcessCpuLoad" });
+
+        for(int i = 0; i < list.size(); ++i) {
+            Attribute att = (Attribute) list.get(i);
+            Double value  = (Double)att.getValue();
+            if(value == -1.0)
+                // usually takes a couple of seconds before we get real values
+                result.add(Double.NaN);
+            else
+                // returns a percentage value with 1 decimal point precision
+                result.add(((int)(value * 1000) / 10.0));
+        }
+
+        return result;
+    }
 }