自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 epoll的惊群效应

epoll惊群效应主要发生在多进程(或多线程)环境中,当多个进程(或线程)同时阻塞等待同一个事件(如客户端连接请求)时,如果事件发生,就会唤醒所有等待的进程(或线程)。这种情况,不建议让多个线程同时在epoll_wait监听的socket,而是让其中一个线程epoll_wait监听的socket,当有新的链接请求进来之后,由epoll_wait的线程调用accept,建立新的连接,然后交给其他工作线程处理后续的数据读写请求,这样就可以避免了由于多线程环境下的epoll_wait惊群效应问题。

2024-12-09 19:38:49 313

原创 机器硬件调优

grub2-mkconfig -o /boot/grub2/grub.cfg (查下具体grub.cfg文件在哪里,不同版本有区别)将 SELINUX=enforcing 改为 SELINUX=disabled。vim /etc/selinux/config 文件。关闭网卡的中断聚合,降低网卡处理消息的延时。关闭 SELinux。

2024-11-21 19:28:18 276

原创 几篇性能文章

https://arthurchiao.art/blog/intro-to-io-uring-zh/https://arthurchiao.art/blog/cgroupv2-zh/https://arthurchiao.art/blog/linux-socket-filtering-aka-bpf-zh/https://arthurchiao.art/blog/intro-to-io-uring-zh/#1-linux-io-%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E6%

2024-11-13 14:01:15 116

原创 linux走内核协议栈发包极限测试

再看看 socket缓冲区是否有满的情况,可以看出还是有少量满的情况出现,这里因为是只有少量的出现满的情况,通过调大socket缓冲区就可以解决;查看下收包服务器server的cpu使用情况,core 0的soft占用100%就是内核协议栈部分,说明这里有瓶颈,跟上图是对的上的;B:树莓派4B(2台,主板集成1G网卡,8G内存,约600元一台)+ h3c家用千兆小交换机(约150元),这套约1500元。服务器(server)--------交换机--------服务器(client)

2024-11-13 14:00:17 882

原创 XDP技术——linux网络处理的高速公路

Cloudflare在他们的DDoS防御L4Drop中便利用了XDP,丢包规则将被转化为eBPF程序,并挂载到XDP钩子上,相比其他方案,无需用轮询独占CPU核,使用更低CPU资源的同时也能提供更加优秀的丢包性能,在云环境下,这种节省宝贵CPU资源的特性是非常吸引人的。XDP技术的发展只过了几年,AF_XDP正式合入内核更是不过三年的时间,但它是Linux内核社区长期维护的技术,具有足以媲美DPDK的性能,具备多种独有的优势。• XDP_PASS会将该数据包继续送往内核的网络协议栈,和传统的处理方式一致。

2024-11-13 13:59:26 516

原创 linux中报文从网卡到用户态recv的架子

分享一篇后台服务器性能优化之网络性能优化,希望大家对Linux网络有更深的理解。曾几何时,一切都是那么简单。网卡很慢,只有一个队列。当数据包到达时,网卡通过DMA复制数据包并发送中断,Linux内核收集这些数据包并完成中断处理。随着网卡越来越快,基于中断的模型可能会因大量传入数据包而导致 IRQ 风暴。这将消耗大部分 CPU 功率并冻结系统。为了解决这个问题,NAPI(中断+轮询)被提议。当内核收到来自网卡的中断时,它开始轮询设备并尽快收集队列中的数据包。

2024-11-13 13:42:43 796

原创 服务器主板北桥南桥的发展

总线是主板传输数据的“道路”,负责 CPU 与芯片组(PCH)、PCH 与功能芯片的连接,包括 QPI、PCIe、DMI、SATA、SAS、SPI 总线等。由于是对前两代(ISA 和 PCI/PCI-X)的升级,PCIe总线又被称为第三代 I/O 总线(3GIO),相比于前两代,数据传输速率更高、传输距离更远、功耗更低、抗干扰能力更强,可以连接各类高速扩展设备,典型如加速图形显示处理器 GPU(Graphics Processing Unit),此外还有 AI 加速卡、PCIe 网卡和视频监控卡等。

2024-11-13 13:41:36 1565

原创 linux syscall耗时分析

每个cpu的core在执行指令(代码)的时候,身边有约30大悍将(寄存器)在辅做,比如最典型的EBP、ESP,当要发生运行空间切换(syscall、中断),这30个寄存器里的数据是不是都要存起来以待再切回来时恢复继续接着干;可以看出,每轮都是第1次耗时最长,约3000(计时单位是时钟周期)这个量级,后面接着的都是300,相差了近10倍;连续20次调用同一个syscall函数,并分别记录每次的耗时;这里带RAW的是会syscall进内核的 */我们平常调的系统调用都是每轮第1次这个样子么?

2024-11-13 13:37:15 389

原创 cpupower命令 – 调整CPU主频

一般在服务器 BIOS 中修改电源管理为 Performance,如果发现 CPU 模式为 conservative 或者 powersave,可以使用 cpupower 设置 CPU Performance 模式,效果也是相当显著的。linux内核支持调节CPU主频,降低功耗,已到达节能的效果。对于移动设备和笔记本来说,在没有接通电源的时候,续航是很重要的。对于服务器,一般都是接着电源的,而且要求性能比较高,因此,建议关闭 CPU 的动态调节功能,禁止 CPU 休眠,并把 CPU 频率固定到最高。

2024-11-13 13:35:38 523

原创 linux挂载磁盘

mkfs -t ext4 /dev/sdb # 格式化相应分区 分区文件格式:ext3 ext4。/dev/sdb1 /data1 ext3 defaults 1 2 # 用真实分区挂载。LABEL=/data /data ext3 defaults 1 2 # 用卷标挂载。n # 创建分区,(一块硬盘最多4个主分区,扩展占一个主分区位置。mount /dev/sdb /data # 挂载。vi /etc/fstab # 添加开机挂载分区。p # 打印分区。

2024-11-13 13:35:05 116

原创 linux c/c++最高效的计时方法

mkfs -t ext4 /dev/sdb # 格式化相应分区 分区文件格式:ext3 ext4。/dev/sdb1 /data1 ext3 defaults 1 2 # 用真实分区挂载。LABEL=/data /data ext3 defaults 1 2 # 用卷标挂载。n # 创建分区,(一块硬盘最多4个主分区,扩展占一个主分区位置。mount /dev/sdb /data # 挂载。vi /etc/fstab # 添加开机挂载分区。p # 打印分区。

2024-11-13 13:34:09 377

原创 linux系统调用过程详细分析

系统级上下文:进程控制块task_struct 、内存管理信息(mm_struct 、vm_area_struct、pgd 、pmd、pte 等)、核心栈等;寄存器上下文:通用寄存器、程序寄存器(IP )、处理机状态寄存器(EFLAGS)、栈指针(ESP);在用户态下只能访问用户空间;在核心态下,两个空间均可访问;每个进程的虚拟地址空间分为两部分:用户空间和内核空间;内核空间在虚拟地址范围固定,且所有进程是同一份;用户级上下文:正文、数据、用户栈以及共享存储区;特权级3,即用户模式(user mode)

2024-11-13 13:33:32 162

原创 常用的命令

进程所有thread绑定在一个core上。linux在目录查找所有文件包含字符串。进程下各thread的cpu占用情况。查看线程bind在哪个core上。绑定进程所有线程到一个core上。windows 查看tcp连接。监控某一个核上的任务。

2024-11-13 13:32:46 565

原创 testtest

int* procRecvfunc(void* arg){ //int index = *(int*)(arg); int fd; int epollfd = g_iRecvEpollFd; struct epoll_event events[MAX_EVENT_NUMBER]; char buf[TCP_BUFFER_SIZE]; int i,ret; unsigned long ulCount = 0; unsigned long ulR

2021-12-29 22:01:18 2139

原创 看看SIMD的魅力

#include <string.h>#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <unistd.h>#include <sys/types.h>#define __USE_GNU#include "common.h"typedef unsigned int uint32_t;struct data{ uint32_t uiV..

2021-09-29 20:52:41 158

原创 常使用的命令

进程下各thread的cpu占用情况ps -eLo pid,lwp,pcpu | grep 30222

2021-09-16 09:23:32 151

原创 利用cpu cache、原子lock实现超高并发场景下hash设计附源码

在码农界,最基础、最常用的数据结构站出来几位,哈希表(又叫散列)应该是够资格的; 列几处哈希表这位重兵把守的地方: 1. 在linux os kernel,在四层UDP和TCP各有一个全局hashtable,报文经过协议栈到四层后由4元组算出哈希索引找到对应的socket表项,从而关联到对应的用户进程; 2. 全互联网都在用的缓存中间件redis,就是一个hashtable上挂了各种各样的数据结构;...

2021-09-07 13:41:24 312

原创 2021-09-06

┌────────────────────────────────────────────────────────────────────┐ │ ? MobaXterm Personal Edition v7.6 ? │ │ (X server, SSH client and GNU/Cygwin tools) │ │ ...

2021-09-06 07:49:20 508

原创 原子操作耗时分析

main_lock.c#include <string.h>#include <stdio.h>#include <stdlib.h>#include <sys/epoll.h>#include <unistd.h>#include <sys/syscall.h>#include <sys/types.h>#define __USE_GNU#include <sched.h>#include

2021-09-02 13:56:37 285

原创 hash研究

mhash.c#include <pthread.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <ctype.h>#include <stdint.h>#include "common.h"#include "mhash.h"uint64_t g_uiquerycount

2021-08-27 13:38:12 160

原创 字节序及内存对齐

低 高|————————————————————————| 内存左低右高0x12345678大端序: 0x12345678 高位存低地址,低位存高地址 也是肉眼序、网络序列 只要少数cpu是大端序小端序: 0x78563412 高位存高地址,低位存低地址 x86 arm等主流cpu是小端序[root@localhost test]# gcc main_test.c[root@localhost test]# ./a.outD

2021-08-26 15:12:29 313

原创 linux gcc 原子操作函数

type __sync_fetch_and_add (type ptr, type value, …)// 将value加到ptr上,结果更新到ptr,并返回操作之前ptr的值type __sync_fetch_and_sub (type ptr, type value, …)// 从ptr减去value,结果更新到ptr,并返回操作之前ptr的值type __sync_fetch_and_or (type ptr, type value, …)// 将ptr与value相或,结果更新到ptr,

2021-08-26 11:00:17 454

原创 设置cpu亲和力demo

#include <sys/time.h>#include <stdlib.h>#include <stdio.h>#include <sys/epoll.h>#include <unistd.h>#include <sys/syscall.h>#include <sys/types.h>#define __USE_GNU#include <sched.h>#include <ctype.

2021-08-23 15:55:04 237

原创 高并发hash性能研究

mhash.htypedef struct node{ unsigned char strkey[48]; void *pdata; struct node *next;}node;typedef struct hashtable{ struct node * head; int count; pthread_spinlock_t lock;}hashtable;#define ERROR_SUCCESS 0#define ERROR_FAIL

2021-08-21 18:01:43 131

转载 认识中断是什么

本文转自 作者:闪客sun 公众号:低并发编程本来想写内核如何接收一个网络包这个过程,但发现把整个过程捋顺了,还是很难的。推导整个过程的起点是中断,包括硬中断和软中断。而这个过程要是讲清楚吧,感觉在整个网络包接收原理的大流程中有点喧宾夺主。但要是一笔带过吧,那对于这块有困惑的人就很难受,一切的起点没整明白在心里总是个疙瘩。所以,单拎出来一个主题中断,给大家把这个问题搞明白了,之后讲内核收包时直接引过来就好了,不想看的直接过,想看的就可以有篇前置文章详细了解,美滋滋。另外,整个操作系统就是一个中

2021-08-19 13:58:05 302

原创 如何测试一次内存访问的耗时?

程序在运行的过程访问主存每次是按cpu cache line 64B访问的(主流cpu cache line一般都是64B),如果命令L1 cache耗时约1ns,如果命令L2 cache耗时约3ns,如果命令L3 cache耗时约12ns,如果访问内存约50-100ns,上面这些数据都是从些网上的文章资料得知的。 如何写段代码测试下内存的访问时间,结果应该接近50-100ns ,本文介绍下测试方法: 1. 申请几段连续的虚拟内存,总大小4GB; 2. 给申请的4GB内存按页...

2021-07-30 00:20:30 2725 1

原创 高并发编程

1s 1000ms 1000 000us 1000 000 000ns 1000 000 000 000ps以上时间单位分别是秒、毫秒、微妙、纳秒、皮秒,上面这么多个0都表示1秒的时间计算机系统中典型的操作耗时表操作耗时备注L1 cache访问1nsL2 cache访问3nsL3 cache访问12ns一次访问内存64B65ns当前...

2021-07-23 22:46:41 250 1

原创 什么是linux namespace?什么又是pod?图文助你速懂

什么是namespace?什么又是命名空间?以是怎么做到的隔离?初接触这些概念让人整的很懵,以为是很高深的东西,整明白了,其实就简单的很。

2021-07-08 17:14:34 279

原创 linux作为服务端应该合理设置哪些参数---swappiness

swappiness参数值从0到100,比如设置成10表示物理内存还剩10%时会使用swap分区;通常linux作为服务端运行redis、kafka等这类中间件,建议设置成1;查看系统swappiness值:设置系统swappiness值:/etc/sysctl.conf 文件中增加一行:vm.swappiness=11执行sysctl -p生效配置注意:sysctl vm.swappiness=10 这样修改,未保存配置,重启后还原成以前的...

2021-07-08 09:53:19 378

原创 kafka linux单机简易安装

前提是先安装好JDK下载kafka版本http://kafka.apache.org/downloadslinux上执行下载:wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.8.0/kafka_2.13-2.8.0.tgz解压包:tar -zxvf kafka_2.13-2.8.0.tgzzookeeper直接使用kafka中自带的,修改zookeeper配置如果zookeeper是集群配置,zookeepe

2021-07-07 21:04:27 173 1

原创 kafka为什么要部署在linux上

首先我们先看看要把 Kafka 安装到什么操作系统上。说起操作系统,可能你会问 Kafka 不是 JVM 系的大数据框架吗?Java 又是跨平台的语言,把 Kafka 安装到不同的操作系统上会有什么区别吗?其实区别相当大!的确,如你所知,Kafka 由 Scala 语言和 Java 语言编写而成,编译之后的源代码就是普通的“.class”文件。本来部署到哪个操作系统应该都是一样的,但是不同操作系统的差异还是给 Kafka 集群带来了相当大的影响。目前常见的操作系统有 3 种:Linux、Windows 和

2021-07-07 20:07:33 322

原创 java的static和final

import java.util.ArrayList;public class HelloMain { public static void main(String[] args) { Person p1 = new Person(555); System.out.println(p1.count); System.out.println(p1.ID); Person p2 = new Person(666); S

2021-06-30 16:06:27 98

原创 Java中的abstract class和interface

1.abstract class 只能做为父类被extends,不能实例对象;2.不一定有abstract function;3.有abstract function的class一定是abstract class;4.abstract function由子类实现;public abstract class Employee{ private int iAge; private String strName; public Employee(String strParam

2021-06-29 16:15:38 451

原创 gcc支持的原子操作函数系统

type __sync_fetch_and_add(typeptr,type value,…);// m+ntype __sync_fetch_and_sub(typeptr,type value,…);// m-ntype __sync_fetch_and_or(typeptr,type value,…); // m|ntype __sync_fetch_and_and(typeptr,type value,…);// m&ntype __sync_fetch_and_xor(typep

2021-06-29 11:22:52 105

原创 Java泛型

泛型类:public class Stu<N, A, S> { private N name; // 姓名 private A age; // 年龄 private S sex; // 性别 // 创建类的构造函数 public Stu(N name, A age, S sex) { this.name = name; this.age = age; this.sex = sex; }

2021-06-28 18:58:08 77

原创 Java的transient这人关键字,有点无聊

Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。作用:Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。当一个对象被序列化的时候,transien...

2021-06-28 17:26:10 82

原创 UDP发包极限测试

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

2021-06-06 16:35:35 825

原创 raspberry pi 4 ubuntu新安装

raspberry pi 4 ubuntu安装官网下载ubuntu-20.04.2-preinstalled-server-arm64+raspi.img.xzubuntu默认登录账号密码都是ubuntu,登录会要求改新密码开启root登录,sudo passwd root,设置root密码,sudo root切到root/etc/hostname是修改主机名配置无线网卡/etc/netplan/50-cloud-init.yamlnetwork: ethern

2021-06-06 16:20:28 413

原创 linux性能工具

修改进程在指定cpu上运行:taskset -pc 3 21184进程启动时指定CPU: taskset -c 1 ./redis-server ../redis.conf1.统计丢包netstat -sroot@U2:~# netstat -s -uIcmpMsg: InType0: 6 InType3: 2840330 InType5: 715 InType8: 11 InType11: 48 OutType0: 11 OutT...

2021-06-05 16:14:51 410 1

原创 快速排序

// quick_sort.gopackage mainimport ( "fmt")func findKth(a []int, K int) int { iLen := len(a) var i, j, v, flag, pos int i = 0 j = iLen - 1 flag = 1 v = a[0] for i < j { if flag > 0 { if a[j] >= v { j-- } else { a[i].

2021-05-08 16:42:27 81

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除