一些有用的工具

有很多有用的工具和命令,平时使用的很多,但是感觉自我总结的不如前辈们的好,秉承着不转载的原则,只是贴出链接

性能监控:

1 netstat工具:

Linux netstat命令详解

2 iperf工具:

这是测试两台机器之间的网络用的

在服务端运行iperf,输入命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
iperf –s –p 12345 –i 1 –M 
```

以在本机端口12345上启用iperf

在客户端运行iperf,输入命令

```c
iperf –c server-ip –p server-port –i 1 –t 10
```

3 http_load:

这是测试url的吞吐量用的

[http_load官网](http://www.acme.com/software/http_load/)

```c
http_load -f 10000 -r 100 -s 10 -p 100 urls.txt
```

-fetches 简写-f :含义是总计的访问次数

-rate 简写-r :含义是每秒的访问频率

-seconds简写-s :含义是总计的访问时间

-parallel 简写-p:并发访问的线程数

urls是一个url 列表,每个url 单独的一行。可以单个页面。

4 fio:

这是测试磁盘IOPS用的

[linux使用FIO测试磁盘的iops](http://ns.35.com/?p=227)

**性能调优:**

1.gprof:

[Linux性能评测工具之一:gprof篇](http://blog.csdn.net/stanjiang2010/article/details/5655143)

这个工具比较轻量级,能看到所有的函数调用链,和函数运行时间,原生是只支持单线程监控的,通过文中的方法,可以支持多线程

2.Perf:

[Perf -- Linux下的系统性能调优工具,第 1 部分](http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/)

比较复杂一点的监控程序

**编程用:**

3.c读取配置文件:

很常用的功能,直接pull了一个

[c读取配置文件](http://www.lellansin.com/c-%E8%AF%BB%E5%8F%96%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6.html)

4.curl测试一个http请求的延时分析

```c
#!/bin/bash
set -e

curl_format='
time_namelookup: %{time_namelookup}
time_connect(TCP handshake): %{time_connect}
time_appconnect(SSL handshake): %{time_appconnect}
time_pretransfer: %{time_pretransfer}
time_redirect: %{time_redirect}
time_starttransfer: %{time_starttransfer}
———-
time_total: %{time_total}
'

exec curl -w "$curl_format" -o /dev/null -s "$@"

5.tcp测试connect

源代码

然后抓包看一下SYN的使用时间,就能定位连接的时间了

抓包可以参考这篇BLOG

Where SLOW

6.gd库进行图片压缩

源代码

png压缩后图片会变大,具体原因没深究,目前把png图片缩略以后当jpg存储

7.iptables防火墙设置

linux下IPTABLES配置详解

比如除了22端口全禁止

那么就是

1
2
3
4
-p INPUT DROP
-p OUTPUT DROP
-A INPUT -p tcp --dport 22 -j ACCEPT
-A OUTPUT -p tcp --sport 22 -j ACCEPT

8.修改ip

/etc/sysconfig/network-scripts/ifcfg-eth0

然后service network restart

9.nginx如何将错误重定向到另外一台服务器

有两种方法

这一种是本地的错误导向其他服务器

1
2
3
4
5
6
7
8
9
10
11
upstream server2 { 
server 10.0.0.1:80;
}
server {
location /my_blog {
error_page 404 = @try_server2;
}
location @try_server2 {
proxy_pass http://server2;
}
}

而这一种是把一个IP的proxy错误导向另外一个IP的服务器

如果想要把一组IP的错误导向另外一组IP的服务器,做复杂的主备线路,那么在两个proxy的ip上配置nginx再做proxy负载均衡即可

1
2
3
4
5
6
7
8
9
10
server { 
location / {
proxy_pass http://online;
}
}
proxy_next_upstream http_404;
upstream online {
server 172.16.3.17:80 max_fails=0;
server 172.16.3.18:80 backup;
}

404在nginx中是不认为是错误的,所以要用proxy_next_upstream http_404,否则会无限循环去请求主IP。

10.linux性能分析工具:

linux性能分析工具

11.top查看某个程序

如mongodb,top -p $(pidof mongod)

12.infer是facebook开源的一个代码静态分析工具

依赖gcc 4.8.2,python 2.7

1
infer -- make -o infer-out

这样就能对C的代码进行分析了,很方便,对于空指针和内存泄漏的判断可能不是很准,但是对于资源泄漏判断还是很准的。facebook还在改进它,期待

infer教程(需要翻墙)

infer中文教程

13.tcpcopy是国人开发的请求工具,能将线上流量引入线下系统中。对于故障在灰度的复现,或者是进行各种测试等等都很有帮助

不过美中不足的是使用中实际上会丢包

使用tcpcopy导入线上流量进行功能和压力测试

14.ThreadSanitizer又叫TSan,是一个检查线程Data Race的C/C++工具

Data Race是指多个线程在没有正确加锁的情况下,同时访问同一块数据,并且至少有一个线程是写操作,对数据的读取和修改产生了竞争,从而导致各种不可预计的问题。

只支持64位系统(内核版本也要够高,如果是centos fallback的版本,可能会出现??的函数),gcc 4.8版本以上,clang 3.2版本以上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <pthread.h>
#include <stdio.h>

int Global;
//pthread_mutex_t mutex;

void *Thread1(void *x) {
//pthread_mutex_lock(&mutex);
Global++;
//pthread_mutex_unlock(&mutex);
return NULL;
}

void *Thread2(void *x) {
//pthread_mutex_lock(&mutex);
Global--;
//pthread_mutex_unlock(&mutex);
return NULL;
}


int main() {
//pthread_t t[2];
//pthread_mutex_init(&mutex,NULL);
pthread_create(&t[0], NULL, Thread1, NULL);
pthread_create(&t[1], NULL, Thread2, NULL);
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
}

ubuntu下要带上-ltsan,centos不需要带

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
root@ubuntu:~# gcc -o test test.c -fsanitize=thread -fPIE -pie -g -ltsan -m64          
root@ubuntu:~# ./test
==================
WARNING: ThreadSanitizer: data race (pid=1676)
Read of size 4 at 0x7fe3f2778084 by thread T2:
#0 Thread2 /root/test.c:12 (exe+0x000000000aad)
#1 __tsan_write_range ??:0 (libtsan.so.0+0x00000001b1c9)

Previous write of size 4 at 0x7fe3f2778084 by thread T1:
#0 Thread1 /root/test.c:7 (exe+0x000000000a68)
#1 __tsan_write_range ??:0 (libtsan.so.0+0x00000001b1c9)

Thread T2 (tid=1678, running) created by main thread at:
#0 pthread_create ??:0 (libtsan.so.0+0x00000001eccb)
#1 main /root/test.c:19 (exe+0x000000000b36)

Thread T1 (tid=1677, finished) created by main thread at:
#0 pthread_create ??:0 (libtsan.so.0+0x00000001eccb)
#1 main /root/test.c:18 (exe+0x000000000b15)

SUMMARY: ThreadSanitizer: data race /root/test.c:12 Thread2
==================
ThreadSanitizer: reported 1 warnings

如果把注释取消,设置了锁以后,则不会报错

要点:

1 除了加-fsanitize=thread外,一定要加-fPIE -pie,但是不要加-lpthread

2 -g 是为了能显示文件名和行号。

3 如果分生成obj(-c)和link两个步骤,每一步都加:-fsanitize=thread -fPIE -pie -g,并且在link的时候加-ltsan

4 只支持64位,最好指定编译64位(-m64)

5 如果依赖其他静态库,其他静态库编译时必须指定-fPIC(如果不是请重编)

另外还有AddressSanitizer,可以检测出内存访问越界(堆栈都可)

1
2
3
4
5
6
7
8
9
10
[root@centos ~]# gcc -fsanitize=address -fno-omit-frame-pointer -g -lpthread -o test test.c
[root@centos ~]# ./test
ASAN:SIGSEGV
=================================================================
==13390== ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000400a47 sp 0x7fffb99c9d30 bp 0x7fffb99c9db0 T0)
AddressSanitizer can not provide additional info.
#0 0x400a46 (/root/main+0x400a46)
#1 0x7f7b55487cdc (/lib64/libc-2.12.so+0x1ecdc)
#2 0x400828 (/root/main+0x400828)
==13390== ABORTING

另外AddressSanitizer和ThreadSanitizer不能一起用

15 qperf

能够查看网络带宽以及网络延时,还能看到各个包大小对网络延时的影响,对于机器的DEBUG是很不错的

1
2
3
安装:yum install qperf
服务端:qperf
客户端:qperf myserver -oo msg_size:1:64K:*2 -vu tcp_lat

16 快速删除大量文件

1
2
3
建立空目录/root/empty

rsync --delete-before -avH --progress --stats /root/empty/ /tmp/test/log/