网卡offload GSO

1. GSO和TSO TSO(TCP Segmentation Offload): 是一种利用网卡来对大数据包进行自动分段,降低CPU负载的技术。 其主要是延迟分段 GSO(Generic Segmentation Offload): GSO是协议栈是否推迟分段,在发送到网卡之前判断网卡是否支持TSO,如果网卡支持TSO则让网卡分段,否则协议栈分完段再交给驱动 如果TSO开启,GSO会自动开启 驱动程序在注册网卡设备的时候默认开启GSO: NETIF_F_GSO 驱动程序会根据网卡硬件是否支持来设置TSO: NETIF_F_TSO 可以通过ethtool -K来开关GSO/TSO 2. 开启关系 GSO开启, TSO开启: 协议栈推迟分段,并直接传递大数据包到网卡,让网卡自动分段 GSO开启, TSO关闭: 协议栈推迟分段,在最后发送到网卡前才执行分段 GSO关闭, TSO开启: 同GSO开启, TSO开启 GSO关闭, TSO关闭: 不推迟分段,在tcp_sendmsg中直接发送MSS大小的数据包 对紧急数据包或GSO/TSO都不开启的情况,才不会推迟发送, 默认使用当前MSS 开启GSO后,tcp_send_mss返回mss和单个skb的GSO大小,为mss的整数倍 3. 包处理流程图 ……

阅读全文

Linux 内核符号表

1. 什么是符号(symbols) 什么是Symbol? 其实就是kernel中的变量(VariableName)或函数名称(Function Name) 这样可以方便程序员在写程序时可以直接参照这一份Symbol的索引文件,找到所需要的kernel信息, 这一份Symbol的索引文件又称为kernel symbol table 2. 内核符号表(Kernel Symbol Table) 内核符号表,就是在内核的内部函数或变量中,可供外部引用的函数和变量的符号表. 其实就是一个索引文件,它存在的目的就是让外部软件可以知道kernel文件内部实际分配的位置. 编译内核时,System.map文件用于存放内核符号表信息 System.map文件位于/或者/boot、/usr/src/linux/下 3. kallsyms 内核启动时候创建,供oops时定位错误,文件大小总为0,包含当前内核导出的、可供使用的变量或者函数;它只是内核数据的简单表示形式. /proc/kallsyms是一个在启动时由Linux kernel实时产生的文件,当系统有任何变更时,它就会马上做出修正 可以理解为动态的符号表 4. 符号类型 符号类型 名称 说明 A Absolute 符号的值是绝对值,并且在进一步链接过程中不会被改变 B BSS 符号在未初始化数据区或区(section)中,即在BSS段中 C Common 符号是公共的。公共符号是未初始化的数据。在链接时,多个公共符号可能具有同一名称。如果该符号定义在其他地方,则公共符号被看作是未定义的引用 D Data 符号在已初始化数据区中 G Global 符号是在小对象已初始化数据区中的符号。某些目标文件的格式允许对小数据对象(例如一个全局整型变量)可进行更有效的访问 I Inderect 符号是对另一个符号的间接引用 N Debugging 符号是一个调试符号 R Read only 符号在一个只读数据区中 S Small 符号是小对象未初始化数据区中的符号 T Text 符号是代码区中的符号 U Undefined 符号是外部的,并且其值为0(未定义 - Stabs 符号是a.……

阅读全文

Linux 内核调试 kdump vmcore

1. kdump介绍 linux内核发送崩溃时,kdump会生成一个内核转储文件vmcore。 可以通过分析vmcore分析出内核崩溃的原因. crash是一个被广泛应用的内核奔溃转储文件分析工具. 使用crash调试内核转储文件,需要安装crash工具和内核调试工具kernel-debuginfo. 2. 安装kdump crash kexec-tools 一般在系统镜像文件中就有相对应的rpm包 3. 配置kdump vim /boot/grub/menu.lst: 设置 crashkernel=auto vim /etc/kdump.conf: path /var/crash (core文件产生的目录) 4. 启动kdump systemctl start kdump 5. 安装kernel-debuginfo 下载内核版本对应的文件 kernel-debuginfo-3.10.0-957.el7.x86_64.rpm kernel-debuginfo-common-x86_64-3.10.0-957.el7.x86_64.rpm 6. 分析vmcore abrt-cli list crash /usr/lib/debug/lib/modules/3.10.0-957.el7.x86_64/vmlinux vmcore crash> bt PID: 7473 TASK: ffff9027d874bf40 CPU: 0 COMMAND: "cat" #0 [ffff9026d0ea3638] machine_kexec at ffffffffbd060b2a #1 [ffff9026d0ea3698] __crash_kexec at ffffffffbd113402 #2 [ffff9026d0ea3768] crash_kexec at ffffffffbd1134f0 #3 [ffff9026d0ea3780] oops_end at ffffffffbd717778 #4 [ffff9026d0ea37a8] no_context at ffffffffbd706f98 #5 [ffff9026d0ea37f8] __bad_area_nosemaphore at ffffffffbd70702f #6 [ffff9026d0ea3848] bad_area_nosemaphore at ffffffffbd7071a0 #7 [ffff9026d0ea3858] __do_page_fault at ffffffffbd71a730 #8 [ffff9026d0ea38c0] do_page_fault at ffffffffbd71a925 #9 [ffff9026d0ea38f0] page_fault at ffffffffbd716768 [exception RIP: strcmp+32] RIP: ffffffffbd353d20 RSP: ffff9026d0ea39a0 RFLAGS: 00010202 RAX: 000000000000002f RBX: ffff90240da5a080 RCX: 0000000000000000 RDX: 0000000000000000 RSI: 0000000000000001 RDI: ffff9026cd27fc11 RBP: ffff9026d0ea39a0 R8: 00000000004b1de2 R9: ffff9026cd27fc10 R10: ffff90253fc01d00 R11: ffffc0428c349fc0 R12: 0000000000000001 R13: ffff9026cd27fc10 R14: 0000000000000001 R15: ffff9027c16f1580 ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018 #10 [ffff9026d0ea39a8] send_log at ffffffffc0c22fd5 [xx] #11 [ffff9026d0ea3ac0] user_file at ffffffffc0c0c571 [xx] #12 [ffff9026d0ea3f00] sys_open at ffffffffc0c56670 [xxt] #13 [ffff9026d0ea3f50] system_call_fastpath at ffffffffbd71f7d5 RIP: 00007f2e860c2a30 RSP: 00007fff6d8755a8 RFLAGS: 00010202 RAX: 0000000000000002 RBX: 00007fff6d875868 RCX: 000000000060bc60 RDX: 1fffffffffff0000 RSI: 0000000000000000 RDI: 00007fff6d876293 RBP: 0000000000001000 R8: 0000000000000000 R9: 0000000000000000 R10: 00007fff6d875020 R11: 0000000000000246 R12: 0000000000402644 R13: 0000000000010000 R14: 0000000000000000 R15: 0000000000000000 ORIG_RAX: 0000000000000002 CS: 0033 SS: 002b crash> dis -l ffffffffbd353d20 /usr/src/debug/kernel-3.……

阅读全文

vpp-cli命令行总结

1. 介绍 vpp网络协议栈配备了一组调试命令。访问CLI(具有适当权限)的最简单方法是使用vppctl命令: sudo vppctl <cli command> CLI解析器匹配静态的关键字字符串后,调用动作执行函数。 你可以通过在代码源文件中搜索VLIB_CLI_COMMAND宏的来查找CLI命令的源代码. 2. 调试和Telnet CLI 使用unix交互式参数或启动配置选项启用调试CLI。 这会导致VPP不以守护进程的情况启动,并在运行它的终端上显示命令行界面. 使用cli-listen localhost:5002选项启用Telnet CLI,这将导致VPP侦听localhost地址端口5002上的TCP连接。 然后,Telnet客户端可以连接到此端口(例如,telnet localhost 5002)并将收到命令行提示符。 以下配置将启用这两种机制: unix { interactive cli-listen localhost:5002 } CLI以横幅图形(可以禁用)和命令行提示符提示CLI开始。对于VPP的发布版本,命令行提示符通常为“vpp”, 对于启用了调试功能的开发版本,命令行提示符为“DBGvpp#”,可以通过unix cli-prompt设置命令行提示符, 并通过unix cli-no-banner来禁止横幅. 3. CLI特征 <-或-> 左右光标键,在命令行内移动光标。 Ctrl-左/右将向左或向右搜索下一个单词的开头。 Home / end将光标跳转到行的开头和结尾。 可以使用exit命令关闭CLI。 或者,空输入行上的^ D也将关闭会话。关闭调试会话也将关闭VPP 4. 命令行参数与配置文件 VPP网络协议栈可以在命令行或配置文件中提供配置参数。 您可以通过搜索VLIB_CONFIG_FUNCTION宏在源代码中找到命令行参数解析器的相关代码。 调用VLIB_CONFIG_FUNCTION(foo_config,“foo”)将使函数foo_config接收名为“foo”的参数块中给出的所有参数, 例如:“foo {arg1 arg2 arg3 …}” VPP应用程序必须能够找到自己的可执行映像。确保这一点最简单方法是通过给出其绝对路径来调用VPP应用程序; 例如:/usr/bin/vpp 。 在启动时,VPP应用程序通过解析自己的ELF段以生成初始化,配置和退出处理程序的列表 配置文件: 还可以在启动配置文件中提供命令行参数,配置文件的路径在命令行上提供给VPP应用程序。 配置文件的格式是一个简单的文本文件,其内容与命令行相同,但是能够使用换行符使内容更加易于阅读。 例如: unix { nodaemon /var/log/vpp/vpp.log full-coredump cli-listen localhost:5002 } api-trace { on } dpdk { dev 0000:03:00.……

阅读全文

Shared Memory

1. Shared Memory介绍 共享内存是System V版本的最后一个进程间通信方式。共享内存,顾名思义就是允许两个不相关的进程访问同一个逻辑内存, 共享内存是两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常为同一段物理内存。 进程可以将同一段物理内存连接到他们自己的地址空间中,所有的进程都可以访问共享内存中的地址。 如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程. 特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前, 并无自动机制可以阻止第二个进程开始对它进行读取,所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量. 2. C语言demo程序 //comm.h #ifndef _COMM_H__ #define _COMM_H__ #include<stdio.h> #include<sys/types.h> #include<sys/ipc.h> #include<sys/shm.h> #define PATHNAME "." #define PROJ_ID 0x6666 int CreateShm(int size); int DestroyShm(int shmid); int GetShm(int size); #endif //comm.c #include"comm.h" static int CommShm(int size,int flags) { key_t key = ftok(PATHNAME,PROJ_ID); if(key < 0) { perror("ftok"); return -1; } int shmid = 0; if((shmid = shmget(key,size,flags)) < 0) { perror("shmget"); return -2; } return shmid; } int DestroyShm(int shmid) { if(shmctl(shmid,IPC_RMID,NULL) < 0) { perror("shmctl"); return -1; } return 0; } int CreateShm(int size) { return CommShm(size,IPC_CREAT | IPC_EXCL | 0666); } int GetShm(int size) { return CommShm(size,IPC_CREAT); } //client.……

阅读全文

Unix domain socket

1. Unix domain socket介绍 Unix domain socket 又叫 IPC(inter-process communication 进程间通信) socket,用于实现同一主机上的进程间通信. socket 原本是为网络通讯设计的,但后来在 socket 的框架上发展出一种 IPC 机制,就是 UNIX domain socket. 虽然网络 socket 也可用于同一台主机的进程间通讯(通过 loopback 地址 127.0.0.1),但是 UNIX domain socket 用于 IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程. 这是因为,IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的. UNIX domain socket 是全双工的,API 接口语义丰富,相比其它 IPC 机制有明显的优越性,目前已成为使用最广泛的 IPC 机制, 比如 X Window 服务器和 GUI 程序之间就是通过 UNIX domain socket 通讯的. Unix domain socket 是 POSIX 标准中的一个组件,所以不要被名字迷惑,linux 系统也是支持它的. 2. C语言demo程序 下面是一个非常简单的服务器端程序,它从客户端读字符,然后将每个字符转换为大写并回送给客户端 #include <stdlib.h> #include <stdio.h> #include <stddef.h> #include <sys/socket.……

阅读全文

video server

1. SRS介绍 SRS/3.0,OuXuli,是一个流媒体集群,支持RTMP/HLS/WebRTC/SRT/GB28181,高效、稳定、易用,简单而快乐。 101 SRS is a RTMP/HLS/WebRTC/SRT/GB28181 streaming cluster, high efficiency, stable and simple. 项目地址: https://github.com/ossrs/srs 2. 运行docker容器启动srs服务 sudo docker run -d -p 1935:1935 -p 1985:1985 -p 8080:8080 ossrs/srs:3 3. 使用ffmpeg推流 需要安装ffmpeg ./pushflow.sh cat pushflow.sh #!/bin/bash while : do sudo ffmpeg -re -i dog.mp4 -vcodec copy -acodec copy -f flv -y rtmp://192.168.1.7:1935/live/livestream sleep 1 done 4. 终端使用vlc播放器拉流 视频地址填写: rtmp://192.168.1.7:1935/live/livestream 5. 使用live555支持rtsp 需要添加网关以指定监听地址 可以使用ffmpeg来转换视频源格式 ffmpeg -i dance.mp4 -codec copy -bsf: h264_mp4toannexb -f h264 dance.……

阅读全文

openssh8.1 rpm build

1. 创建工作路径 mkdir -p /root/rpmbuild/{SOURCES,SPECS} cp openssh-8.1p1.tar.gz /root/rpmbuild/SOURCES/ 2. 下载源码包 wget https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/openssh-8.1p1.tar.gz 3. 制作准备 yum install rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip tar -zxf openssh-8.1p1.tar.gz cp ./openssh-8.1p1/contrib/redhat/openssh.spec . sed -i -e "s/%define no_x11_askpass 0/%define no_x11_askpass 1/g" openssh.spec sed -i -e "s/%define no_gnome_askpass 0/%define no_gnome_askpass 1/g" openssh.spec 4. 制作rpm包 rpmbuild -ba openssh.spec 如果出现 错误:构建依赖失败: openssl-devel < 1.1 被 ?? 需要 解决方法: vi openssh.spec 注释掉 BuildRequires: openssl-devel < 1.……

阅读全文

自建kvm虚拟机

1. 自定义虚拟机 egrep -q "(svm|vmx)" /proc/cpuinfo && echo "yes" lsmod|grep kvm # centos yum install -y qemu-kvm #KVM主程序,KVM虚拟化模块 yum install -y libvirt #虚拟化服务库 yum install -y bridge-utils ln -s /usr/libexec/qemu-kvm /usr/bin/qemu-kvm # ubuntu apt install qemu qemu-kvm apt install libvirt-bin apt install bridge-utils ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm systemctl start libvirtd systemctl enable libvirtd qemu-img create -f qcow2 vm_NGC.img 20G #创建磁盘镜像 qemu-kvm -name vm_NGC -m 4096 -cpu host -enable-kvm -smp 8 -hda vm_NGC.……

阅读全文

DPDK-Devbind

dpdk-devbind.py #! /usr/bin/env python # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2010-2014 Intel Corporation # import sys import os import getopt import subprocess from os.path import exists, abspath, dirname, basename # The PCI base class for all devices network_class = {'Class': '02', 'Vendor': None, 'Device': None, 'SVendor': None, 'SDevice': None} encryption_class = {'Class': '10', 'Vendor': None, 'Device': None, 'SVendor': None, 'SDevice': None} intel_processor_class = {'Class': '0b', 'Vendor': '8086', 'Device': None, 'SVendor': None, 'SDevice': None} cavium_sso = {'Class': '08', 'Vendor': '177d', 'Device': 'a04b,a04d', 'SVendor': None, 'SDevice': None} cavium_fpa = {'Class': '08', 'Vendor': '177d', 'Device': 'a053', 'SVendor': None, 'SDevice': None} cavium_pkx = {'Class': '08', 'Vendor': '177d', 'Device': 'a0dd,a049', 'SVendor': None, 'SDevice': None} cavium_tim = {'Class': '08', 'Vendor': '177d', 'Device': 'a051', 'SVendor': None, 'SDevice': None} cavium_zip = {'Class': '12', 'Vendor': '177d', 'Device': 'a037', 'SVendor': None, 'SDevice': None} avp_vnic = {'Class': '05', 'Vendor': '1af4', 'Device': '1110', 'SVendor': None, 'SDevice': None} network_devices = [network_class, cavium_pkx, avp_vnic] crypto_devices = [encryption_class, intel_processor_class] eventdev_devices = [cavium_sso, cavium_tim] mempool_devices = [cavium_fpa] compress_devices = [cavium_zip] # global dict ethernet devices present.……

阅读全文

最近文章

分类

标签

友情链接

其它