一些有用的工具

原创内容,转载请注明出处

Posted by Weakyon Blog on August 19, 2014

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

性能监控:

1 netstat工具:

Linux netstat命令详解

2 iperf工具:

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

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

  
iperf s p 12345 i 1 M 

以在本机端口12345上启用iperf

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

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

3 http_load:

这是测试url的吞吐量用的

http_load官网

  
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

性能调优:

1.gprof:

Linux性能评测工具之一:gprof篇

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

2.Perf:

Perf – Linux下的系统性能调优工具,第 1 部分

比较复杂一点的监控程序

编程用:

3.c读取配置文件:

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

c读取配置文件

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

#!/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端口全禁止

那么就是

-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如何将错误重定向到另外一台服务器

有两种方法

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

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负载均衡即可

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

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版本以上

#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不需要带

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,可以检测出内存访问越界(堆栈都可)

[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是很不错的

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

16 快速删除大量文件

建立空目录/root/empty

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