跳至主要內容
Linux dump内存

在分析netty堆外内存泄漏的时候,想查看堆外内存存储了些什么,所以写了这个小工具。确实gdb也可以实现,但gdb会处理其它信号,可能会影响程序的正常运行。生产配合arthas一起食用


DHB小于 1 分钟LinuxLinux
gdb基本用法

单步调试和跟踪函数调用

命令 描述
backtrace(或bt) 查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
quit(或q) 退出gdb调试环境
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,如果有函数调用则进入到函数中

DHB大约 2 分钟LinuxLinux
Linux select实现socket单线程多路复用

select版本比阻塞版本的性能起码高了3倍+

# select版本
dhb@dev:~/下载/webbench-1.5$ webbench -c 1000 -t 30 http://127.0.0.1:1500/t
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1:1500/t
1000 clients, running 30 sec.

Speed=735248 pages/min, 269580 bytes/sec.
Requests: 367610 susceed, 14 failed.

# 阻塞版本
dhb@dev:~/下载/webbench-1.5$ webbench -c 1000 -t 30 http://127.0.0.1:1500/t
Webbench - Simple Web Benchmark 1.5
Copyright (c) Radim Kolar 1997-2004, GPL Open Source Software.

Benchmarking: GET http://127.0.0.1:1500/t
1000 clients, running 30 sec.

Speed=261244 pages/min, 95729 bytes/sec.
Requests: 130540 susceed, 82 failed.


DHB大约 4 分钟网络LinuxSocketIO
Linux socket笔记

linux socket创建tcp连接例子

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>


using namespace std;

int main() {
    int client;

    /*
     * socket函数的方法签名
     * int socket (int __family, int __type, int __protocol)
     * __family     定义协议族
     * __type       定义数据传输方式/套接字类型
     * __protocol   定义传输协议
     *
     * 返回值是文件描述符
     *
     * */
    client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

    if (client < 0) {
        cout << "=> 连接失败" << endl;
    }

    /*
    * 位于netinet/in.h
    * 将套接字和IP、端口判断
    *
    * */
    struct sockaddr_in server_addr{};
    // 使用IPv4
    server_addr.sin_family = AF_INET;
    // 端口
    server_addr.sin_port = htons(1500);
    // IP地址
    server_addr.sin_addr.s_addr = htons(INADDR_ANY);

    /*
     * struct sockaddr* 位于socket.h
     * bind()签名
     * int bind (int, const struct sockaddr *__my_addr, socklen_t __addrlen);
     * 第一个参数:socket文件描述符
     * 第二个参数:struct sockaddr*
     * 第三个参数:struct sockaddr* 长度
     * */
    if (bind(client, (struct sockaddr *) &server_addr, sizeof(server_addr)) < 0) {
        cout << "=> 绑定socket异常" << endl;
        exit(1);
    }


    // 设置监听
    listen(client, SOMAXCONN);

    struct sockaddr_in client_addr{};
    socklen_t client_addr_len = sizeof(client_addr);
    int server;
    while (true) {
        server = accept(client, (struct sockaddr *) &client_addr, &client_addr_len);

        if (server < 0) {
            cout << "=> accept 错误" << endl;
            exit(1);
        }
        // todo 写怎么接收数据
    }
}

DHB大约 1 分钟网络LinuxSocketIO