strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息

可谓是 linux 下的调试利器,不仅可以用来找程序错误,系统为什么挂死了,命令为什么报错,还可以用来查找哪些程序占用系统资源。

命令实例

比如,但网站服务器负载过大,网站数量又多,不知是那个网站占用太多资源,这时strace派上用场了。

第一步,查看 php-cgi 进程号:

ps aux|grep php-cgi

第二步,查看系统调用

strace -p 进程号

或者,将记录结果存在output.txt文件中

strace -o output.txt -T -tt -e trace=all -p 进程号

mac下的命令为dtruss

pstack 看活动的进程内的堆栈

pstack 进程号

用top查看某个进程的信息,top -p 进程号

top之后按P是按cpu使用率排序,M是按内存使用率排序


通常我们用 ls -l 来查看目录下文件,第一列有10个字符,第一个字符就是代表着当前文件的属性,Linux的文件属性有6种

1、d表示该文件是一个目录,字母"d",是dirtectory(目录)的缩写

        注意:目录或者是特殊文件,这个特殊文件存放其他文件或目录的相关信息

2、l表示该文件是一个链接文件。字母"l"是link(链接)的缩写,类似于windows下的快捷方式

3、b的表示块设备文件(block),一般置于/dev目录下,设备文件是普通文件和程序访问硬件设备的入口,是很特殊的文件。没有文件大小,只有一个主设备号和一个辅设备号。一次传输数据为一整块的被称为块设备,如硬盘、光盘等。最小数据传输单位为一个数据块(通常一个数据块的大小为512字节)

4、c表示该文件是一个字符设备文件(character),一般置于/dev目录下,一次传输一个字节的设备被称为字符设备,如键盘、字符终端等,传输数据的最小单位为一个字节

5、p表示该文件为命令管道文件。与shell编程有关的文件

6、s表示该文件为sock文件。与shell编程有关的文件

在php下面可以用 posix_mkfifo('/tmp/test.sock', 0666); 来创建一个管道文件,ulink来删除一个管道文件

用 stream_socket_server("unix:///tmp/test.sock", $errno, $errmsg); 来创建一个 sock文件,ulink('/tmp/test.sock')删除sock文件,记住不是ulink('unix:///tmp/test.sock');


CLOC -- Count Lines of Code

可能大家都知道用 `wc -l` 命令进行代码行数统计,但是它会将代码中的注释、空行所占用的文本行都统计在内。如果想查看一个 tar 包或一个项目目录中“实际”的代码行数并且不愿意自己去写一个脚本来做此类工作,那么可以考虑使用 cloc。

cloc 是一个 perl 脚本,它可以统计很多种编程语言的代码文件中的空行、注释以及实际的代 码行数。

官方地址: http://cloc.sourceforge.net/

安装:

1、找到最新版下载地址并下载

2、解压

tar zxvf cloc-1.62.tar.gz

3、安装

sudo make install

只需上面简单的几部,即可安装好cloc,Linux、Mac下面都亲测成功!

使用

1、统计目录下代码行数

   $ cloc ./
      11 text files.
       6 unique files.                              
       8 files ignored.
    <a href="http://cloc.sourceforge.net">http://cloc.sourceforge.net</a> v 1.62  T=0.18 s (16.5 files/s, 54526.8 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
Perl                             2            697           1048           8054
make                             1             26             35             75
-------------------------------------------------------------------------------
SUM:                             3            723           1083           8129
-------------------------------------------------------------------------------

2、统计压缩包代码行数

cloc swoole-src-swoole-1.7.8-stable.tar.gz
     270 text files.
     270 unique files.                                          
      64 files ignored.
http://cloc.sourceforge.net v 1.62  T=1.26 s (163.6 files/s, 29714.1 lines/s)
-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               83           3136           2473          21520
C/C++ Header                    22            746            845           3788
PHP                             87            421            393           3118
XML                              1              2              0            490
m4                               1             33              7            202
Go                               3             17              4             76
CMake                            1             16             11             29
C++                              1              6             15             26
YAML                             1              7              1             13
Javascript                       2              2              0             11
make                             2              1              0              5
Python                           1              2              0              5
Bourne Shell                     1              1              0              2
-------------------------------------------------------------------------------
SUM:                           206           4390           3749          29285
-------------------------------------------------------------------------------

3、对比压缩包代码差异

cloc --diff swoole-src-swoole-1.7.8-stable.tar.gz swoole-src-swoole-1.7.9-stable.tar.gz

更多使用方法,请看官网。。。


一个产品的编码完成,并不能代表产品能够给用户体验,其中还必须包含测试、压测分析等,而往往我们的产品上线前却忽略掉压测分析。既然压测分析很重要那么我们应该如何进行呢?

工具:

ab、webbench、siege、benchmark

使用方法:http://www.epooll.com/archives/768/

系统优化:

Linux 默认的设置并不能满足高并发需求,需要进行以下设置

1、文件打开数

临时设置

ulimit -n 102400

永久设置

echo 'ulimit -SHn 102400' >> /etc/profile

source /etc/profile 

2、端口最大的监听队列的长度

echo 'net.core.somaxconn = 120000' >> /etc/sysctl.conf

sysctl -p

或:

echo 120000>/proc/sys/net/core/somaxconn

somaxconn定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数,默认值为128,对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。 服务进程会自己限制侦听队列的大小(例如 sendmail(8) 或者 Apache),常常在它们的配置文件中有设置队列大小的选项。大的侦听队列对防止拒绝服务 DoS 攻击也会有所帮助。

压测:

1、短连接

ab -n 100000 -c1000 192.168.0.170:2000/

服务器对应操作:

$serv->send($fd, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\nhello");

$serv->close($fd);

2、长连接

ab -k -n 100000 -c1000 192.168.0.170:2000/

服务器对应操作:

$serv->send($fd, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\nConnection: keep-alive\r\n\r\n");

//$serv->close($fd);  // 记得不要关闭连接,否则就又成了短连接了

注意:

如果ulimit是默认的1024,那-n 顶多就1024,多了,也是会在1024以内就出现:

apr_socket_recv: Connection reset by peer (104)

Total of 8813 requests completed

如果somaxconn还是默认的128也会出现上面的错误,所以压测的前提是提高

1、进程文件打开数

2、端口监听队列


一、何为ulimit

ulimit为shell内建指令,可用来控制shell执行程序的资源

二、ulimitl默认值是多少

[root@mttx ~]# ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 8064

max locked memory (kbytes, -l) 32

max memory size (kbytes, -m) unlimited

open files (-n) 1024

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 8064

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

三、为何要修改ulimit

对于需要做许多socket 连接并使它们处于打开状态的Java 应用程序而言,

最好通过使用ulimit -n xx 修改每个进程可打开的文件数,缺省值是1024,有时候会遇上Socket/File: Can’t open so many files或too many open files的问题.

四、怎么修改ulimit

1、在/etc/rc.local中增加

ulimit -SHn 65535

2、在/etc/profile中增加

ulimit -SHb 65535

然后source /etc/profile让参数即时生效

3、在/etc/security/limits.conf 中增加

* soft nproc 65535

* hard nproc 65535

* soft nofile 65535

* hard nofile 65535

说明:* 代表针对所有用户,nproc是代表最大进程数,nofile 是代表最大文件打开数.修改了limits.conf文件之后,要让它立即生效,只需关闭当前session,重新连接即可

五、扩展阅读

在Linux下面部署应用的时候,,其实Linux是有文件句柄限制的,而且默认不是很高,一般都是1024,作为一台生产服务器,其实很容易就达到这个数量,因此我们需 要把这个值改大一些。

这里,有很多ulimit的文章都说的很含糊,究竟这个1024 是系统的限制,还是用户的限制呢。其实,这个是用户限制来的,完整的说法,应该是当前用户准备要运行的程序的限制。

1、这个限制是针对单个程序的限制

2、这个限制不会改变之前已经运行了 的程序的限制

3、对这个值的修改,退出了当前的shell就会消失

比如说,我先运行了一个程序A,然后 通过ulimit修改了限制为2048,然后运行B,然后退出了shell再登录,然后运行C。那就只有B可以打开2048个句柄。

其中一个方法,是想ulimit修改命令放入/etc/profile 里面,但是这个做法并不好

正确的做法,应该是修改/etc /security/limits.conf

那系统总限制呢

其实是在这里,/proc/sys /fs/file-max

可以通过cat查看目前的 值,echo来立刻修改

另外还有一个,/proc/sys /fs/file-nr

只读,可以看到整个系统目前使用的文 件句柄数量

查找文件句柄问题的时候,还有一个很 实用的程序lsof

可以很方便看到某个进程开了那些句柄

也可以看到某个文件/目录被什么进程 占用了

如果你使用squid的话,你要在/etc/init.d/squid的文件加入ulimit -HSn 65535.另外,在squid.conf中也要加入max_filedesc 16384

注:上面这种方式只是改变了用户登陆系统后的文件打开数,对于/etc/init.d/nginxphp这种的启动脚本并不起作用,像这种启动脚本,需要在脚本内加一行:

ulimit -HSn 65535

才行。

转自:http://cpu86.bokee.com/59900665.html