netlink简介

netlink是一种Linux内核和用户空间程序通信的方式,相比通过procfs进行通信,netlink的好处在于可以异步的由内核发送消息给用户空间而不需要用户程序轮询procfs。

在内核端建立一个通信接口,接收来自用户的消息

在用户空间连接netlink接口与内核通信

#include 
#include 
#include 
#include 
#include 
 
#include 
 
using std::cerr;
using std::endl;
 
int main()
{
    struct sockaddr_nl sa;
    bzero(&sa, sizeof(sa));
    sa.nl_family = AF_NETLINK;
    sa.nl_pid = getpid();
    sa.nl_groups = 0;
 
    int fd = socket(AF_NETLINK, SOCK_RAW, 31);
    if (fd < 0)
    {
        cerr << "Failed to create socket" << endl;
        return -1;
    }
    bind(fd, (struct sockaddr*)&sa, sizeof(sa));
 
 
    struct sockaddr_nl ksa;
    bzero(&ksa, sizeof(ksa));
    ksa.nl_family = AF_NETLINK;
 
    struct nlmsghdr *nh = (struct nlmsghdr*)
        malloc(sizeof(struct nlmsghdr) + 1024);
 
    strcpy((char*)NLMSG_DATA(nh), "hello world");
 
    nh->nlmsg_pid = 0;
    struct iovec iov = { nh, nh->nlmsg_len };
    struct msghdr msg = { &ksa, sizeof(ksa), &iov, 1, NULL, 0, 0 };
 
    sendmsg(fd, &msg, 0);
    return 0;
}

网络性能调优

建立连接

为了保证可靠连接,tcp 建立连接需要“三次握手”,这三次握手对 tcp 的性能有至关重要的影响。
如何缩小这三次握手给性能带来的影响是网络性能调优的一个重要关注点。

三次握手

  • 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。这个阶段可调节的参数有:
    • net.ipv4.tcp_syn_retries: syn报文的重传次数.(至于重传机制,暂时还没搞清楚)
    • net.ipv4.tcp_fastopen: 开启这个选项可以使 tcp 在第一个 SYN 包中就开始传送数据.(关于这个选项还需要进一步研究:是否需要对端也开启此选项)
  • 服务器端收到 SYN 报文,进入SYN_RECV状态,回应一个 SYN(SEQ=y)ACK(ACK=x+1) 报文。这个阶段可调节的参数有:
    • net.ipv4.tcp_max_syn_backlog: 服务器中 syn 队列的长度.当 syncookies 使能时,此时并不会有一个合法的最大值, 因此这个值会被忽略。 详见man listen
    • sysctl -w net.ipv4.tcp_syncookies=1 , 打开syncookie,在syn backlog队列不足的时候,提供一种机制临时将syn链接换出
    • net.ipv4.tcp_synack_retries: synack报文的重传次数.(同样地,还未搞清楚重传机制)
    • net.core.somaxconn: 这个参数限制了listen()函数的syn队列大小,默认值为128,需适当提高这个值。
  • 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
    继续阅读“网络性能调优”

pbuilder & cowbuilder

简介

cowbuilder 是 debian 官方提供的一个软件打包工具,它的作用是创建出一个独立的环境,
然后将 Debian 软件源码包导入这个环境中打包。这样做有很多好处,首先这将软件打包环境独立出来,
使得软件打包不会弄乱你的机器实际的运行环境,其次,这样做有助于检查软件包的依赖关系是否正确,
因为 cowbuilder 创建出的独立环境通常是一个最小化环境,此时如果写错了依赖,在 cowbuilder 打包时就立刻能发现。

cowbuilder和pbuilder的使用方式差不多,很多参数也都通用,实际上,可以把cowbuilder看成一个cow版的pbuilder
继续阅读“pbuilder & cowbuilder”

debian 系发行版 initramfs 调试方法

简介

在进行 debian 系统开发时,如果开发工作涉及对 initramfs 定制修改,就需要对 debian 的 initramfs 有一个详细的了解。
本文希望通过对 linux 系统普遍使用的 initramfs 和 debian 系统如何自动生成使用 initramfs 的讲解,来减轻读者在 debian 系统及其衍生版本上开发调试 initramfs 时的痛苦。

继续阅读“debian 系发行版 initramfs 调试方法”