memprof 0.3.8 → 0.3.9
Sign up to get free protection for your applications and to get access to all the features.
- data/ext/tracers/fd.c +42 -5
- data/ext/tracers/gc.c +16 -1
- data/ext/tracers/mysql.c +1 -1
- data/ext/tracers/resources.c +0 -2
- data/ext/util.h +2 -0
- data/memprof.gemspec +1 -1
- metadata +6 -6
data/ext/tracers/fd.c
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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);
|
data/ext/tracers/gc.c
CHANGED
@@ -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
|
-
|
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()
|
data/ext/tracers/mysql.c
CHANGED
@@ -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
|
-
|
33
|
+
uint64_t millis = 0;
|
34
34
|
int ret;
|
35
35
|
|
36
36
|
millis = timeofday_ms();
|
data/ext/tracers/resources.c
CHANGED
@@ -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
data/memprof.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
spec = Gem::Specification.new do |s|
|
2
2
|
s.name = 'memprof'
|
3
|
-
s.version = '0.3.
|
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:
|
5
|
-
prerelease:
|
4
|
+
hash: 1
|
5
|
+
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
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-
|
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.
|
141
|
+
rubygems_version: 1.3.7
|
142
142
|
signing_key:
|
143
143
|
specification_version: 3
|
144
144
|
summary: Ruby Memory Profiler
|