memprof 0.3.8 → 0.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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