歡迎光臨
每天分享高質量文章

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:

  • eBCC效能分析最佳實踐(0) – 開啟效能分析新篇章

  • eBCC效能分析最佳實踐(1) – 線上lstat, vfs_fstatat 開銷高情景分析

  • eBCC效能分析最佳實踐(2) – 一個簡單的eBCC分析網路函式的latency

  • 敬請期待…

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:
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        |****************************************|

Example

Client:

 1#include 
2#include 
3#include 
4#include 
5#include 
6#include 
7#include 
8#include 
9#include 
10#include 
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 
2#include 
3#include 
4#include 
5#include 
6#include 
7#include 
8#include 
9#include 
10#include 
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}

已同步到看一看
贊(0)

分享創造快樂