前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >eBCC性能分析最佳实践(2) - 一个简单的eBCC分析网络函数的latency

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

作者头像
Linux阅码场
发布2019-06-04 11:26:15
7380
发布2019-06-04 11:26:15
举报
文章被收录于专栏:LINUX阅码场LINUX阅码场

这是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链接时的监控

代码语言:javascript
复制
1/usr/share/ebcc/tools/tcpconnect

server

server accept时的监控

代码语言:javascript
复制
1/usr/share/ebcc/tools/tcpaccept

client latency

client 发起connect() 的latency

代码语言:javascript
复制
1/usr/share/ebcc/tools/tcpconnlat

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

client send latency

代码语言:javascript
复制
 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:

代码语言:javascript
复制
 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:

代码语言:javascript
复制
 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>
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, 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);  ///服务器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, 0, sizeof(sendbuf));
46        memset(recvbuf, 0, sizeof(recvbuf));
47    }
48
49    close(sock_cli);
50    return 0;
51}

Server:

代码语言:javascript
复制
 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>
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}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Linux阅码场 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0. Intro
  • 1. 建立tcp链接,分析latency
    • 场景
      • client
        • server
          • client latency
          • 2. tcp传输,send,recv 次数和latency统计
            • client send latency
            • Example
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档