Linux如何查看服务器的并发数

Linux如何查看服务器的并发数,第1张

linux查看连接数,并发数1、查看apache当前并发访问数:

netstat

-an

grep

ESTABLISHED

wc

-l对比httpd.conf中MaxClients的数字差距多少。2、查看有多少个进程数:ps

auxgrep

httpdwc

-l3、可以使用如下参数查看数据server-status?auto#ps

-efgrep

httpdwc

-l1388统计httpd进程数,连个请求会启动一个进程,使用于Apache服务器。表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整。#netstat

-natgrep

-i

80wc

-l4341netstat

-an会打印系统当前网络链接状态,而grep

-i

80是用来提取与80端口有关的连接的,wc

-l进行连接数统计。

最终返回的数字就是当前所有80端口的请求总数。#netstat

-nagrep

ESTABLISHEDwc

-l376netstat

-an会打印系统当前网络链接状态,而grep

ESTABLISHED

提取出已建立连接的信息。

然后wc

-l统计。最终返回的数字就是当前所有80端口的已建立连接的总数。netstat

-natgrep

ESTABLISHEDwc

-

可查看所有建立连接的详细记录

查看Apache的并发请求数及其TCP连接状态:linux命令:netstat

-n

awk

'/^tcp/

{++S[$NF]}

END

{for(a

in

S)

print

a,

S[a]}'返回结果示例:LAST_ACK

5SYN_RECV

30ESTABLISHED

1597FIN_WAIT1

51FIN_WAIT2

504TIME_WAIT

1057其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。(这个参数还不太懂,为啥是等待超时结束,请大神指教)

linux的版本也分很多种,而且你要测得是网页的并发量吧 那你可以查看apache当前并发访问数:netstat -an | grep ESTABLISHED | wc -l 最大并发量就在 httpd.conf中MaxClients的数字

TCP通信的模式如下图,比较固定,对着图编代码就可以了:

服务器的main函数:

int main(int argc, char **argv)

{

 int listenfd, connfd

 pid_t childpid

 socklen_t clilen

 struct sockaddr_in cliaddr, servaddr//IPv4 address

 /*socket*/

 listenfd = socket(AF_INET, SOCK_STREAM, 0)//创建一个TCP的socket

 if (-1 == listenfd) {

  perror("socket erro.")

  return -1

 }

 /*bind*/

 //首先初始化server的IP地址和端口,然后再与刚刚创建的socket绑定

 bzero(&servaddr, sizeof(servaddr))

 servaddr.sin_family = AF_INET//设置协议簇

 servaddr.sin_addr.s_addr = htonl(INADDR_ANY)//绑定本机的网卡

 servaddr.sin_port = htons(1234)//绑定端口号,端口号可以随便取,大于1024就可以了

 if (-1 == bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) {

  perror("bind error.")

  return -1

 }

 /*listen*/

 //到这里已经有了一个绑定了IP地址和端口号的socket了,但是这个socket是个主动的socket,

 //而作为server需要的是一个等待别的接入的被动的socket,所以得调用listen将这个socket设置为监听状态

 //第二个参数表示服务器正在处理客户接入时的等待队列长度。

 if (-1 == listen(listenfd, 10)) {

  perror("listen error.")

  return -1

 }

 while (1) {

  clilen = sizeof(cliaddr)

  //调用accept等待客户的接入,同时accept会用第二个参数返回客户的IP地址,

  //通过第三个参数返回IP地址的实际大小,同时这个参数也是个值-结构参数,也就是

  //在传递这个参数的时候,先给这个参数一个初始的值,然后函数中会根据具体的情况修改这个值,

  //所以这里传递的是指针。

  //当客户接入后,将返回一个成功和客服连接的socket描述符,通过读写这个socket即可实现和客户的通信了

  connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen)

  if (-1 == connfd) {

   if (EINTR == errno)

    continue

   perror("accept error.")

   return -1

  }

  //通过fock创建子进程来处理客户请求,这里只是显示客户的IP地址、端口号和发送的文字,

  //并将客户发送的文字回传给客户。

  if (0 == (childpid=fork())) {//fock返回0 说明是子进程

   //这里并没有关闭服务器的监听socket,只是将其引用计数减一,因为fork出来的子进程对父进程做了拷贝,

   //所以这个监听socket的引用计数将由1变成2,而内核只有在一个socket的引用计数变为0才回去关闭它

   close(listenfd)

   //通过和客户连接的socket和客户通信     

   str_echo(connfd, cliaddr)

   return 0

  }

  //父进程将和客户连接的socket的引用计数减一,同样并没有关闭这个socket

  close(connfd)

 }

 return 0

}

服务器处理客户请求:

#define BSIZE 100

void str_echo(int sockfd, struct sockaddr_in cliaddr)

{

 ssize_t n

 char buf[BSIZE]

 

 while ((n=read(sockfd, buf, BSIZE))) {//读取客户发送的信息

  buf[n] = '\0'

  printf("IP: %s, PORT: %d: %s\n", \

    inet_ntoa(cliaddr), ntohs(cliaddr.sin_port), buf)//输出信息

  n_write(sockfd, buf, n)//将受到的信息发送回客户,n_write的实现下面给出

 }

}

客户端程序相对简单:

int main(int argc, char **argv)

{

 int sockfd

 struct sockaddr_in servaddr

 

 if (2 != argc) {

  printf("usage: ./client 127.0.0.1")//

  return -1

 }

 /*socket*/

 sockfd = socket(AF_INET, SOCK_STREAM, 0) //创建一个socket

 if (-1 == sockfd) {

  perror("socket error.")

  return -1

 }

 /*connect*/

 //首先初始化要连接的服务器的IP地址和端口号,然后调用connect去连接这个服务器

 bzero(&servaddr, sizeof(servaddr))

 servaddr.sin_family = AF_INET

 servaddr.sin_port = htons(1234)

 inet_pton(AF_INET, argv[1], &servaddr.sin_addr)

 if (-1 == connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) {

  perror("connect error.")

  return -1

 }

 //连接成功后就可以通过这个socket来和服务器通信了

 str_cli(stdin, sockfd)

return 0

}

n_write 和 readline

/*write n bytes to fd*/

ssize_t n_write (int fd, void *buf, size_t n)

{

 size_t nleft = n

 ssize_t nwriten

 char *bufp = buf

while (nleft >0) {

  if ((nwriten = write (fd, bufp, nleft)) <= 0) {

   if (EINTR == errno)

    nwriten = 0

   else

    return -1

  }

nleft -= nwriten

  bufp += nwriten

 }

return n

}

/*read line from fd*/

ssize_t readline (int fd, void *buf, size_t maxlen)

{

 ssize_t n, rc

 char c, *bufp

bufp = buf

 for (n = 1n <maxlenn ++) {

again:

  if (1 == (rc = read (fd, &c, 1))) {

   *bufp ++ = c

   if ('\n' == c)

    break  /*newline is stored*/

  } else if (rc == 0) {

   *bufp = 0

   return (n - 1)  /*EOF, n-1 bytes were read*/

  } else {

   if (EINTR == errno) /*interrupt*/

    goto again

   return -1  /*Erro, set the errno by read ()*/

  }

 }

 *bufp = 0

 return n

}

运行结果:

因为客户端没有指定IP地址和端口,所以其IP和端口都是内核随机分配的。


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/195522.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-01
下一篇2023-04-01

发表评论

登录后才能评论

评论列表(0条)

    保存