eBCC性能分析最佳实践(2) - 一个简单的eBCC分析网络函数的latency

这是eBCC系列的终结篇。 eBCC 源代码可以在如下地址获得:

 
 

http://koji.aliyun-inc.com/kojifiles/packages/ebcc/1.0.0/3.1.al7/src/ebcc-1.0.0-3.1.al7.src.rpm

祝大家五一快乐!

Guide:

0. Intro

BCC是基于4.x kernel版本上的ebpf发展出来的一套性能分析工具集;

eBCC,顾名思义则是extended BCC的缩写,是阿里巴巴内核团队在Aliyun Linux 2上对BCC项目的拓展,包含BCC本身已有的工具集,和我们新开发的一些小的工具; eBCC则是基于在最新的BCC版本0.9之上做了一些拓展。

Aliyun Linux则使用了相对比较前沿,较新的kernel版本,支持ebpf特性,所以,如果想尝试ebpf,eBCC带来的系统上对“性能优化调试” 和 “问题诊断”上的新体验,那就请赶快升级到Aliyun Linux 2上吧。

1. 建立tcp链接,分析latency

场景

  1. 建立tcp链接,分析网络函数的latency

  2. tcp传输,send,recv 次数和latency统计

client

client发起connect链接时的监控

1/usr/share/ebcc/tools/tcpconnect

server

server accept时的监控

1/usr/share/ebcc/tools/tcpaccept

client latency

client 发起connect() 的latency

1/usr/share/ebcc/tools/tcpconnlat

2. tcp传输,send,recv 次数和latency统计

client send latency

 1Client: 2 3[root@xxx /home/ahao.mah/socket] 4#./client1 5hello muahao 6^@ 7 8Server: 910[root@xxx /home/ahao.mah/socket]11#./server1
2
3[root@xxx /home/ahao.mah/socket]
4#./client1
5hello muahao
6^@
7
8Server:
9
10[root@xxx /home/ahao.mah/socket]
11#./server1

latency:

 1[root@xxx ] 2#/usr/share/ebcc/tools/funclatency -i 1 c:send  -p 65035 3Tracing 1 functions for "c:send"... Hit Ctrl-C to end. 4     nsecs               : count     distribution 5         0 -> 1          : 0        |                                        | 6         2 -> 3          : 0        |                                        | 7         4 -> 7          : 0        |                                        | 8         8 -> 15         : 0        |                                        | 9        16 -> 31         : 0        |                                        |10        32 -> 63         : 0        |                                        |11        64 -> 127        : 0        |                                        |12       128 -> 255        : 0        |                                        |13       256 -> 511        : 0        |                                        |14       512 -> 1023       : 0        |                                        |15      1024 -> 2047       : 0        |                                        |16      2048 -> 4095       : 0        |                                        |17      4096 -> 8191       : 0        |                                        |18      8192 -> 16383      : 0        |                                        |19     16384 -> 32767      : 1        |****************************************|
2#/usr/share/ebcc/tools/funclatency -i 1 c:send  -p 65035
3Tracing 1 functions for "c:send"... Hit Ctrl-C to end.
4     nsecs               : count     distribution
5         0 -> 1          : 0        |                                        |
6         2 -> 3          : 0        |                                        |
7         4 -> 7          : 0        |                                        |
8         8 -> 15         : 0        |                                        |
9        16 -> 31         : 0        |                                        |
10        32 -> 63         : 0        |                                        |
11        64 -> 127        : 0        |                                        |
12       128 -> 255        : 0        |                                        |
13       256 -> 511        : 0        |                                        |
14       512 -> 1023       : 0        |                                        |
15      1024 -> 2047       : 0        |                                        |
16      2048 -> 4095       : 0        |                                        |
17      4096 -> 8191       : 0        |                                        |
18      8192 -> 16383      : 0        |                                        |
19     16384 -> 32767      : 1        |****************************************|

Example

Client:

 1#include <sys/types.h> 2#include <sys/socket.h> 3#include <stdio.h> 4#include <netinet/in.h> 5#include <arpa/inet.h> 6#include <unistd.h> 7#include <string.h> 8#include <stdlib.h> 9#include <fcntl.h>10#include <sys/shm.h>1112#define MYPORT  888713#define BUFFER_SIZE 102414#define DST_IP "10.137.16.6"1516int main()17{18    ///定义sockfd19    int sock_cli = socket(AF_INET,SOCK_STREAM, 0);2021    ///定义sockaddr_in22    struct sockaddr_in servaddr;23    memset(&servaddr, 0, sizeof(servaddr));24    servaddr.sin_family = AF_INET;25    servaddr.sin_port = htons(MYPORT);  ///服务器端口26    servaddr.sin_addr.s_addr = inet_addr(DST_IP);  ///服务器ip2728    ///连接服务器,成功返回0,错误返回-129    if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)30    {31        perror("connect");32        exit(1);33    }3435    char sendbuf[BUFFER_SIZE];36    char recvbuf[BUFFER_SIZE];37    while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)38    {39        send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送40        if(strcmp(sendbuf,"exit\n")==0)41            break;42        recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收43        fputs(recvbuf, stdout);4445        memset(sendbuf, 0, sizeof(sendbuf));46        memset(recvbuf, 0, sizeof(recvbuf));47    }4849    close(sock_cli);50    return 0;51}#include <sys/types.h>
2#include <sys/socket.h>
3#include <stdio.h>
4#include <netinet/in.h>
5#include <arpa/inet.h>
6#include <unistd.h>
7#include <string.h>
8#include <stdlib.h>
9#include <fcntl.h>
10#include <sys/shm.h>
11
12#define MYPORT  8887
13#define BUFFER_SIZE 1024
14#define DST_IP "10.137.16.6"
15
16int main()
17
{
18    ///定义sockfd
19    int sock_cli = socket(AF_INET,SOCK_STREAM, 0);
20
21    ///定义sockaddr_in
22    struct sockaddr_in servaddr;
23    memset(&servaddr, 0sizeof(servaddr));
24    servaddr.sin_family = AF_INET;
25    servaddr.sin_port = htons(MYPORT);  ///服务器端口
26    servaddr.sin_addr.s_addr = inet_addr(DST_IP);  ///服务器ip
27
28    ///连接服务器,成功返回0,错误返回-1
29    if (connect(sock_cli, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0)
30    {
31        perror("connect");
32        exit(1);
33    }
34
35    char sendbuf[BUFFER_SIZE];
36    char recvbuf[BUFFER_SIZE];
37    while (fgets(sendbuf, sizeof(sendbuf), stdin) != NULL)
38    {
39        send(sock_cli, sendbuf, strlen(sendbuf),0); ///发送
40        if(strcmp(sendbuf,"exit\n")==0)
41            break;
42        recv(sock_cli, recvbuf, sizeof(recvbuf),0); ///接收
43        fputs(recvbuf, stdout);
44
45        memset(sendbuf, 0sizeof(sendbuf));
46        memset(recvbuf, 0sizeof(recvbuf));
47    }
48
49    close(sock_cli);
50    return 0;
51}

Server:

 1#include <sys/types.h> 2#include <sys/socket.h> 3#include <stdio.h> 4#include <netinet/in.h> 5#include <arpa/inet.h> 6#include <unistd.h> 7#include <string.h> 8#include <stdlib.h> 9#include <fcntl.h>10#include <sys/shm.h>1112#define MYPORT  888713#define QUEUE   2014#define BUFFER_SIZE 10241516int main()17{18    ///定义sockfd19    int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);2021    ///定义sockaddr_in22    struct sockaddr_in server_sockaddr;23    server_sockaddr.sin_family = AF_INET;24    server_sockaddr.sin_port = htons(MYPORT);25    server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);2627    ///bind,成功返回0,出错返回-128    if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)29    {30        perror("bind");31        exit(1);32    }3334    ///listen,成功返回0,出错返回-135    if(listen(server_sockfd,QUEUE) == -1)36    {37        perror("listen");38        exit(1);39    }4041    ///客户端套接字42    char buffer[BUFFER_SIZE];43    struct sockaddr_in client_addr;44    socklen_t length = sizeof(client_addr);4546    ///成功返回非负描述字,出错返回-147    int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);48    if(conn<0)49    {50        perror("connect");51        exit(1);52    }5354    while(1)55    {56        memset(buffer,0,sizeof(buffer));57        int len = recv(conn, buffer, sizeof(buffer),0);58        if(strcmp(buffer,"exit\n")==0)59            break;60        fputs(buffer, stdout);61        send(conn, buffer, len, 0);62    }63    close(conn);64    close(server_sockfd);65    return 0;66}#include <sys/types.h>
2#include <sys/socket.h>
3#include <stdio.h>
4#include <netinet/in.h>
5#include <arpa/inet.h>
6#include <unistd.h>
7#include <string.h>
8#include <stdlib.h>
9#include <fcntl.h>
10#include <sys/shm.h>
11
12#define MYPORT  8887
13#define QUEUE   20
14#define BUFFER_SIZE 1024
15
16int main()
17
{
18    ///定义sockfd
19    int server_sockfd = socket(AF_INET,SOCK_STREAM, 0);
20
21    ///定义sockaddr_in
22    struct sockaddr_in server_sockaddr;
23    server_sockaddr.sin_family = AF_INET;
24    server_sockaddr.sin_port = htons(MYPORT);
25    server_sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
26
27    ///bind,成功返回0,出错返回-1
28    if(bind(server_sockfd,(struct sockaddr *)&server_sockaddr,sizeof(server_sockaddr))==-1)
29    {
30        perror("bind");
31        exit(1);
32    }
33
34    ///listen,成功返回0,出错返回-1
35    if(listen(server_sockfd,QUEUE) == -1)
36    {
37        perror("listen");
38        exit(1);
39    }
40
41    ///客户端套接字
42    char buffer[BUFFER_SIZE];
43    struct sockaddr_in client_addr;
44    socklen_t length = sizeof(client_addr);
45
46    ///成功返回非负描述字,出错返回-1
47    int conn = accept(server_sockfd, (struct sockaddr*)&client_addr, &length);
48    if(conn<0)
49    {
50        perror("connect");
51        exit(1);
52    }
53
54    while(1)
55    {
56        memset(buffer,0,sizeof(buffer));
57        int len = recv(conn, buffer, sizeof(buffer),0);
58        if(strcmp(buffer,"exit\n")==0)
59            break;
60        fputs(buffer, stdout);
61        send(conn, buffer, len, 0);
62    }
63    close(conn);
64    close(server_sockfd);
65    return 0;
66}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值