diff --git a/analyze/memcached_conn_scan.py b/analyze/memcached_conn_scan.py
index c6ab6041fbf72a010cdaa6662c77fc62789b97ce..fbd046f7499c02e472ee327c56f0e966e5d73050 100644
--- a/analyze/memcached_conn_scan.py
+++ b/analyze/memcached_conn_scan.py
@@ -15,26 +15,24 @@ def parse_perf_stat(s):
     lines = s.split('\n')
     llc_misses_u = int(list(filter(None, lines[5].split(' ')))[0].replace(',', ''))
     llc_misses_k = int(list(filter(None, lines[6].split(' ')))[0].replace(',', ''))
-    return llc_misses_u + llc_misses_k
+    instructions_u = int(list(filter(None, lines[16].split(' ')))[0].replace(',', ''))
+    instructions_k = int(list(filter(None, lines[17].split(' ')))[0].replace(',', ''))
+    return (llc_misses_u + llc_misses_k, instructions_u + instructions_k)
 
 def extract_conn_qps_exp(exp):
-    ret = ([10, 20, 40, 80, 160, 240, 320], [], [], [], [])
+    ret = ([10, 20, 40, 80, 160, 240, 320], [], [], [], [], [], [])
 
     for f in ret[0]:
         (qps_avg, qps_stddev) = util.extract_exp_avg_stddev(exp, 'c%d' % (f,), parse_memcached_output)
         ret[1].append(qps_avg)
         ret[2].append(qps_stddev)
-        
-        #with open(os.path.join('../data/', exp, 'c%d.txt' % (f,)), 'r') as fi:
-        #    qps = parse_memcached_output(fi.read())
-        #    ret[1].append(qps)
-
-        #with open(os.path.join('../data/', exp, 'stat_c%d.txt' % (f,)), 'r') as fi:
-        #    misses = parse_perf_stat(fi.read()) / (qps * 30)
-        #    ret[2].append(misses)
-        (misses_avg, misses_stddev) = util.extract_exp_avg_stddev(exp, 'stat_c%d' % (f,), parse_perf_stat)
+ 
+        ((misses_avg, instructions_avg), (misses_stddev, instructions_stddev)) = \
+            util.extract_exp_avg_stddev(exp, 'stat_c%d' % (f,), parse_perf_stat)
         ret[3].append(misses_avg / (qps_avg * 30))
         ret[4].append(misses_stddev / (qps_avg * 30))
+        ret[5].append(instructions_avg / (qps_avg * 30))
+        ret[6].append(instructions_stddev / (qps_avg * 30))
 
     return ret
 
@@ -71,7 +69,7 @@ def show_plot(threads, include_caladan = False):
         # but we half the QPS
         name = 'caladan'
         data[name] = extract_conn_qps_exp('memcached_conn_scan.5.4.0-136-generic.caladan.t2')
-        data[name] = (data[name][0], [qps / 2 for qps in data[name][1]], [qps / 2 for qps in data[name][2]], data[name][3], data[name][4])
+        data[name] = (data[name][0], [qps / 2 for qps in data[name][1]], [qps / 2 for qps in data[name][2]], data[name][3], data[name][4], data[name][5], data[name][6])
 
     for k in data:
        plt.errorbar(data[k][0], data[k][1], yerr = data[k][2], capsize = 4, label = k, marker = markers[k], color = colors[k])
@@ -112,6 +110,27 @@ def show_plot(threads, include_caladan = False):
         else:
             plt.savefig('../data/figs/memcached_conn_scan.llc_misses.t%d.png' % (threads,), dpi = 192)
 
+    if not include_caladan or threads == 1:
+        return
+
+    plt.cla()
+    plt.title('Memcached Instructions per Request, c160, %d threads' % (threads,))
+
+    plt.bar(range(len(data)), [data[k][5][4] for k in data], yerr = [data[k][6][4] for k in data], capsize=4)
+    plt.xticks(range(len(data)), data.keys())
+
+    plt.ylabel('Instructions per Request')
+
+    plt.legend()
+    if os.getenv('SAVE_FIGURE') != 'true':
+        plt.rcParams.update({'font.size': 16})
+        plt.show()
+    else:
+        if include_caladan:
+            plt.savefig('../data/figs/memcached_conn_scan.ipr.t%d.caladan.png' % (threads,), dpi = 192)
+        else:
+            plt.savefig('../data/figs/memcached_conn_scan.ipr.t%d.png' % (threads,), dpi = 192)
+
 show_plot(1)
 show_plot(1, True)
 show_plot(8)