memprof 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,6 +27,10 @@ struct memprof_fd_stats {
27
27
  size_t write_requested_bytes;
28
28
  size_t write_actual_bytes;
29
29
 
30
+ size_t recv_calls;
31
+ uint32_t recv_time;
32
+ ssize_t recv_actual_bytes;
33
+
30
34
  size_t connect_calls;
31
35
  uint32_t connect_time;
32
36
 
@@ -42,7 +46,7 @@ static struct memprof_fd_stats stats;
42
46
 
43
47
  static ssize_t
44
48
  read_tramp(int fildes, void *buf, size_t nbyte) {
45
- uint32_t millis = 0;
49
+ uint64_t millis = 0;
46
50
  int err;
47
51
  ssize_t ret;
48
52
 
@@ -63,7 +67,7 @@ read_tramp(int fildes, void *buf, size_t nbyte) {
63
67
 
64
68
  static ssize_t
65
69
  write_tramp(int fildes, const void *buf, size_t nbyte) {
66
- uint32_t millis = 0;
70
+ uint64_t millis = 0;
67
71
  int err;
68
72
  ssize_t ret;
69
73
 
@@ -82,9 +86,29 @@ write_tramp(int fildes, const void *buf, size_t nbyte) {
82
86
  return ret;
83
87
  }
84
88
 
89
+ static ssize_t
90
+ recv_tramp(int socket, void *buffer, size_t length, int flags) {
91
+ uint64_t millis = 0;
92
+ int err;
93
+ ssize_t ret;
94
+
95
+ millis = timeofday_ms();
96
+ ret = recv(socket, buffer, length, flags);
97
+ err = errno;
98
+ millis = timeofday_ms() - millis;
99
+
100
+ stats.recv_time += millis;
101
+ stats.recv_calls++;
102
+ if (ret > 0)
103
+ stats.recv_actual_bytes += ret;
104
+
105
+ errno = err;
106
+ return ret;
107
+ }
108
+
85
109
  static int
86
110
  connect_tramp(int socket, const struct sockaddr *address, socklen_t address_len) {
87
- uint32_t millis = 0;
111
+ uint64_t millis = 0;
88
112
  int err, ret;
89
113
 
90
114
  millis = timeofday_ms();
@@ -102,7 +126,7 @@ connect_tramp(int socket, const struct sockaddr *address, socklen_t address_len)
102
126
  static int
103
127
  select_tramp(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout)
104
128
  {
105
- uint32_t millis = 0;
129
+ uint64_t millis = 0;
106
130
  int ret, err;
107
131
 
108
132
  millis = timeofday_ms();
@@ -120,7 +144,7 @@ select_tramp(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, stru
120
144
  static int
121
145
  poll_tramp(struct pollfd fds[], nfds_t nfds, int timeout)
122
146
  {
123
- uint32_t millis = 0;
147
+ uint64_t millis = 0;
124
148
  int ret, err;
125
149
 
126
150
  millis = timeofday_ms();
@@ -153,6 +177,7 @@ fd_trace_start() {
153
177
  #else
154
178
  insert_tramp("select", select_tramp);
155
179
  insert_tramp("connect", connect_tramp);
180
+ insert_tramp("recv", recv_tramp);
156
181
  #endif
157
182
  }
158
183
 
@@ -195,6 +220,18 @@ fd_trace_dump(json_gen gen) {
195
220
  json_gen_map_close(gen);
196
221
  }
197
222
 
223
+ if (stats.recv_calls > 0) {
224
+ json_gen_cstr(gen, "recv");
225
+ json_gen_map_open(gen);
226
+ json_gen_cstr(gen, "calls");
227
+ json_gen_integer(gen, stats.recv_calls);
228
+ json_gen_cstr(gen, "time");
229
+ json_gen_integer(gen, stats.recv_time);
230
+ json_gen_cstr(gen, "actual");
231
+ json_gen_integer(gen, stats.recv_actual_bytes);
232
+ json_gen_map_close(gen);
233
+ }
234
+
198
235
  if (stats.connect_calls > 0) {
199
236
  json_gen_cstr(gen, "connect");
200
237
  json_gen_map_open(gen);
@@ -3,6 +3,7 @@
3
3
  #include <stdlib.h>
4
4
  #include <string.h>
5
5
  #include <sys/time.h>
6
+ #include <sys/resource.h>
6
7
 
7
8
  #include "arch.h"
8
9
  #include "bin_api.h"
@@ -14,6 +15,8 @@
14
15
  struct memprof_gc_stats {
15
16
  size_t gc_calls;
16
17
  uint32_t gc_time;
18
+ uint32_t gc_utime;
19
+ uint32_t gc_stime;
17
20
  };
18
21
 
19
22
  static struct tracer tracer;
@@ -23,14 +26,20 @@ static void (*orig_garbage_collect)();
23
26
  static void
24
27
  gc_tramp()
25
28
  {
26
- uint32_t millis = 0;
29
+ uint64_t millis = 0;
30
+ struct rusage usage_start, usage_end;
27
31
 
28
32
  millis = timeofday_ms();
33
+ getrusage(RUSAGE_SELF, &usage_start);
29
34
  orig_garbage_collect();
35
+ getrusage(RUSAGE_SELF, &usage_end);
30
36
  millis = timeofday_ms() - millis;
31
37
 
32
38
  stats.gc_time += millis;
33
39
  stats.gc_calls++;
40
+
41
+ stats.gc_utime += TVAL_TO_INT64(usage_end.ru_utime) - TVAL_TO_INT64(usage_start.ru_utime);
42
+ stats.gc_stime += TVAL_TO_INT64(usage_end.ru_stime) - TVAL_TO_INT64(usage_start.ru_stime);
34
43
  }
35
44
 
36
45
  static void
@@ -65,6 +74,12 @@ gc_trace_dump(json_gen gen) {
65
74
 
66
75
  json_gen_cstr(gen, "time");
67
76
  json_gen_integer(gen, stats.gc_time);
77
+
78
+ json_gen_cstr(gen, "utime");
79
+ json_gen_integer(gen, stats.gc_utime);
80
+
81
+ json_gen_cstr(gen, "stime");
82
+ json_gen_integer(gen, stats.gc_stime);
68
83
  }
69
84
 
70
85
  void install_gc_tracer()
@@ -30,7 +30,7 @@ static int (*orig_send_query)(void *mysql, const char *stmt_str, unsigned long l
30
30
  static int
31
31
  real_query_tramp(void *mysql, const char *stmt_str, unsigned long length) {
32
32
  enum memprof_sql_type type;
33
- uint32_t millis = 0;
33
+ uint64_t millis = 0;
34
34
  int ret;
35
35
 
36
36
  millis = timeofday_ms();
@@ -22,8 +22,6 @@ struct memprof_resources_stats {
22
22
  static struct tracer tracer;
23
23
  static struct memprof_resources_stats stats;
24
24
 
25
- #define TVAL_TO_INT64(tv) ((int64_t)tv.tv_sec*1e3 + (int64_t)tv.tv_usec*1e-3)
26
-
27
25
  static void
28
26
  resources_trace_start() {
29
27
  struct rusage usage;
data/ext/util.h CHANGED
@@ -84,4 +84,6 @@ timeofday();
84
84
  */
85
85
  uint64_t
86
86
  timeofday_ms();
87
+
88
+ #define TVAL_TO_INT64(tv) ((int64_t)tv.tv_sec*1e3 + (int64_t)tv.tv_usec*1e-3)
87
89
  #endif
@@ -1,6 +1,6 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'memprof'
3
- s.version = '0.3.8'
3
+ s.version = '0.3.9'
4
4
  s.summary = 'Ruby Memory Profiler'
5
5
  s.description = "Ruby memory profiler similar to bleak_house, but without patches to the Ruby VM"
6
6
  s.homepage = "http://github.com/ice799/memprof"
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: memprof
3
3
  version: !ruby/object:Gem::Version
4
- hash: 3
5
- prerelease:
4
+ hash: 1
5
+ prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 3
9
- - 8
10
- version: 0.3.8
9
+ - 9
10
+ version: 0.3.9
11
11
  platform: ruby
12
12
  authors:
13
13
  - Joe Damato
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2011-01-31 00:00:00 -08:00
21
+ date: 2011-02-02 00:00:00 -08:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  requirements: []
139
139
 
140
140
  rubyforge_project:
141
- rubygems_version: 1.4.2
141
+ rubygems_version: 1.3.7
142
142
  signing_key:
143
143
  specification_version: 3
144
144
  summary: Ruby Memory Profiler