理解Linux高性能网络架构的那些事

Egress 控制在现代网络架构 技术总结 在计算机网络中,“Egress” 指的是从一个网络或设备发送出去的数据流量。它与 “Ingress”(进入网络或设备的数据流量)相对。Egress 控制和管理在现代网络架构中至关重要,特别是在安全性、合规性和性能优化方面。以下是对 Egress 技术的详细总结和使用指南。在计算机网络中,“Egress” 指的是从一个网络或设备发送出去的数据流量。它与 “Ingress”(进入网络或设备的数据流量)相对。Egress 控制和管理在现代网络架构中至关重要,特别是在安全性、合规性和性能优化方面。 阅读详情

通过本文你将会了解到以下内容:

  • IO事件和IO复用

  • 线程模型和事件驱动模型的架构

  • 基于事件驱动的Reactor模式详解

  • 同步IO和异步IO简介

1. IO事件和IO复用

1.1 什么是IO事件

IO指的是输入Input/输出Output,但是从汉语角度来说,出和入是相对的,所以我们需要个参照物。

这里我们的参照物选择为程序运行时的主存储空间,外部通常包括网卡、磁盘等。

有了上述的设定理解起来就方便多了,我们来一起看下:

IO的本质是数据的流动,数据可以从网卡到程序内存,也可以从程序内存写到网卡,磁盘操作也是如此。

所以可以把常见的IO分为:

  • 网络IO:内存和网卡的数据交互

  • 文件IO:内存和磁盘的数据交互

图片

那什么又是IO事件呢?

事件可以理解为一种状态或者动作,也就是状态的迁移会触发一种相应的动作。

网络IO的事件通常包括:

  • 可读事件

  • 可写事件

  • 异常事件

理解可读可写事件是非常有必要的,一般来说一个socket大部分时候是可写的,但是并不是都可读。

可读一般代表是一个新连接或者原有连接有新数据交互,对于服务端程序来说也是重点关注的事件。

图片

1.2 什么是IO复用

设想假如有几万个IO事件,那么应用程序该如何管理呢?这就要提到IO复用了。

IO复用从本质上来说就是应用程序借助于IO复用函数向内核注册很多类型的IO事件,当这些注册的IO事件发生变化时内核就通过IO复用函数来通知应用程序。

图片

从图中可以看到,IO复用中复用的就是一个负责监听管理这些IO事件的线程。

之所以可以实现一个线程管理成百上千个IO事件,是因为大部分时间里某个时刻只有少量IO事件被触发。

图片

大概就像这样:草原上的一只大狗可以看管几十只绵羊,因为大部分时候只有个别绵羊不守规矩乱跑,其他的都是乖乖吃草。

2. 网络框架设计要素

要理解网络框架有哪些,必须要清楚网络框架完成了哪些事情。

图片

大致描述下这个请求处理的流程:

  • 远端的机器A发送了一个HTTP请求到服务器B,此时服务器B网卡接收到数据并产生一个IO可读事件;

  • 我们以同步IO为例,此时内核将该可读事件通知到应用程序的Listen线程;

  • Listen线程将任务甩给Handler线程,由Handler将数据从内核读缓冲区拷贝到用户空间读缓冲区;

  • 请求数据包在应用程序内部进行计算和处理并封装响应包;

  • Handler线程等待可写事件的到来;

  • 当这个连接可写时将数据从用户态写缓冲区拷贝到内核缓冲区,并通过网卡发送出去;

备注:上述例子是以同步IO为例,并且将线程中的角色分为Listen线程、Handler线程、Worker线程,分别完成不同的工作,后续会详细展开。

所以我们可以知道,要完成一个数据交互,涉及了几大块内容:

  • IO事件监听

  • 数据拷贝

  • 数据处理和计算

大白认为,这三大块内容,不论什么形式的框架都绕不开,也是理解网络架构的关键所在。

图片

3. 高性能网络框架实践

3.1 基于线程模型

在早期并发数不多的场景中,有一种One Request One Thread的架构模式。

该模式下每次接收一个新请求就创建一个处理线程,线程虽然消耗资源并不多,但是成千上万请求打过来,性能也是扛不住的。

图片

这是一种比较原始的架构,思路也非常清晰,创建多个线程来提供处理能力,但在高并发生产环境中几乎没有应用,本文不再展开。

3.2 基于事件驱动模型

当前流行的是基于事件驱动的IO复用模型,相比多线程模型优势很明显。

图片

在此我们先理解一下什么是事件驱动Event-Drive-Model。

事件驱动编程是一种编程范式,程序的执行流由外部事件来决定,它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。

通俗来说就是:有一个循环装置在一直等待各种事件的到来,并将到达的事件放到队列中,再由一个分拣装置来调用对应的处理装置来响应。

图片

3.3 Reactor反应堆模式

第一次听到这个模式的时候很困惑,究竟反应堆是个啥?

研究了一下发现,反应堆是个核物理的概念,大致是这个样子的:

核反应堆是核电站的心脏 ,它的工作原理是这样的:原子由原子核与核外电子组成,原子核由质子与中子组成。

当铀235的原子核受到外来中子轰击时,一个原子核会吸收一个中子分裂成两个质量较小的原子核,同时放出2-3个中子。

这裂变产生的中子又去轰击另外的铀235原子核,引起新的裂变,如此持续进行就是裂变的链式反应。

图片

结合这种核裂变的图,好像是一个请求打过来,服务器内部瞬间延伸出很多分支来完成响应,一变二,二变四,甚至更多,确实有种反应堆的感觉。

接下来我们看看究竟反应堆模式是如何构建高性能网络框架的。

4.反应堆模式详解

反应堆模式是一种思想,形式却有很多种。

4.1 反应堆模式的本质是什么

从本质上理解,无论什么网络框架都要完成两部分操作:

  • IO操作:数据包的读取和写入

  • CPU操作:数据请求的处理和封装

所以上述这些问题由谁来做以及多少线程来做,就衍生出了很多形式,所以不要被表面现象迷惑,出现必有原因,追溯之后我们才能真正掌握它。

图片

反应堆模式根据处理IO环节和处理数据环节的数量差异分为如下几种:

  • 单Reactor线程

  • 单Reactor线程和线程池

  • 多Reactor线程和线程池

图片

我们来看看这三种常见模式的特点、原理、优缺点、应用场景等。

4.2 单Reactor线程模式

这种模式最为简洁,一个线程完成了连接的监听、接收新连接、处理连接、读取数据、写入数据全套工作。

由于只使用了一个线程,对于多核利用率偏低,但是编程简单。

是不是觉得这个种单线程的模式没有市场?那可未必,不信你看Redis。

图片

在这种模式种IO操作和CPU操作是没有分开的,都是由1个线程来完成的,显然如果在Handler处理某个请求超时了将会阻塞客户端的正常连接。

在Redis中由于都是内存操作,速度很快,这种瓶颈虽然存在但是不够明显。

4.3 单Reactor线程和线程池模式

为了解决IO操作和CPU操作的不匹配,也就是IO操作和CPU操作是在一个线程内部串行执行的,这样就拉低了CPU操作效率。

图片

一种解决方法就是将IO操作和CPU操作分别由单独的线程来完成,各玩各的互不影响。

单Reactor线程完成IO操作、复用工作线程池来完成CPU操作就是一种解决思路。

图片

在这种模式种由Reactor线程完成连接的管理和数据读取&写回,完全掌管IO操作。

工作线程池处理来自上游分发的任务,对其中的数据进行解码、计算、编码再返回给Reactor线程和客户端完成交互。

这种模式有效利用了多核,但是单Reactor线程来完成IO操作在高并发场景中仍然会出现瓶颈。

换句话说,连接实在太多了,一个Reactor线程忙不过来建立新连接和响应旧连接这些事情,因此Reactor线程也需要几个帮手。

图片

4.4 多Reactor线程和线程池模式

水平扩展往往是提供性能的有效方法。

图片

我们将Reactor线程进行扩展,一个Reactor线程负责处理新连接,多个Reactor线程负责处理连接成功的IO数据读写。

也就是进一步将监听&创建连接 和 处理连接 分别由两个及以上的线程来完成,进一步提高了IO操作部分的效率。

图片

这种模式算是比较高配的版本了,在实际生产环境也有使用。

4.5 拓展:同步IO和异步IO

我们可以轻易区分什么是阻塞IO和非阻塞IO,那么什么是同步IO和异步IO呢?

前面提到Reactor模式其中非常重要的一环就是调用read/write函数来完成数据拷贝,这部分是应用程序自己完成的,内核只负责通知监控的事件到来了,所以本质上Reactor模式属于非阻塞同步IO。

还有一种Preactor模式,借助于系统本身的异步IO特性,由操作系统进行数据拷贝,在完成之后来通知应用程序来取就可以,效率更高一些,但是底层需要借助于内核的异步IO机制来实现。

图片

底层的异步IO机制可能借助于DMA和Zero-Copy技术来实现,理论上性能更高。

当前Windows系统通过IOCP实现了真正的异步I/O,而在Linux 系统的异步I/O还不完善,比如Linux中的boost.asio模块就是异步IO的支持,但是目前Linux系统还是以基于Reactor模式的非阻塞同步IO为主。

5. 小结

本文从IO事件和IO复用出发,阐述了网络架构最底层的组成。

继续展开了基于线程模型和基于事件驱动模型的网络框架特点及其设计要素。

之后重点描述了反应堆模式的核心本质,以及生产环境中的多种形式。

最后简单介绍了同步IO和异步IO的区别,以及Preactor模式的优势。

希望读者朋友可以摒弃专业术语和表述,抓住问题的本质和重点,找到一个适合自己思维方法去理解和掌握高性能网络架构的设计之道。

或许,高性能网络框架只是一个纸老虎。

深入解析Linux网络架构:XDP、Netfilter与tc/qdisc的协同工作流 本文深入解析Linux网络架构中XDP、Netfilter与tc/qdisc三大核心组件的协同工作流。通过实际案例和性能对比,详细介绍了XDP在网卡层的高效数据处理、Netfilter的五链三表机制以及tc/qdisc的流量控制策略,帮助开发者优化网络性能,提升服务器吞吐量。 阅读详情

相关推荐

Docker网络架构解析:核心模式与生产实践

容器网络是云原生技术的核心基础设施,其本质是通过Linux网络命名空间实现隔离,配合虚拟网络设备(veth pair)和iptables规则构建的虚拟化网络层。Docker作为主流容器运行时,提供了bridge、host、none和overlay四种网络模式,分别适用于开发测试、高性能计算、安全隔离和集群部署等场景。在微服务架构下,容器网络需要解决东西向流量管理、服务发现和跨主机通信等挑战。通过理解Docker网络驱动原理和Linux内核机制,可以优化生产环境中的网络性能,实现多网卡绑定、负载均衡等高级功能

weixin_31309419的博客 306

IO复用(Reactor模式和Preactor模式)——用epoll来提高服务器并发能力

文章来源:http://www.cnblogs.com/binchen-china/p/5487795.html 上篇线程/进程并发服务器中提到,提高服务器性能在IO层需要关注两个地方,一个是文件描述符处理,一个是线程调度。 IO复用是什么?IO即Input/Output,在网络编程中,文件描述符就是一种IO操作。 为什么要IO复用? 1.网络编程中非常多函数是阻塞的,如c

$firecat利白的代码足迹$ 6520

IMDb影评数据集:从下载到情感分析实战指南

本文提供了IMDb影评数据集从下载、探索到情感分析建模的完整实战指南。详细介绍了数据预处理、TF-IDF向量化方法,并对比了逻辑回归、随机森林、SVM及LSTM深度学习模型在情感分析任务上的应用与效果评估,帮助读者系统掌握自然语言处理的核心流程。

weixin_29052717的博客 448

从io模型到ppc,tpc,reactor,preactor

nio sendfile 零拷贝 1.网络io模型 这是我们常见的一张图. 1.传统的bio,就是同步阻塞的.当调用socket.read的时候.会阻塞. 知道系统可读/写,当真正去执行读的时候(内核-->用户),还是阻塞. 2.非阻塞io,当调用read时,如果不可读,那么直接返回一个标识,告诉你等会再来问.现在不可读嘞.那么好的,你就过一会问一下.当可读时,去调用recvFrom系统调用.不过此时还是阻塞....

小小李的博客 1316

FPGA以太网接口设计避坑指南:GMII与RGMII时序转换的三种实现方案对比

本文深入解析FPGA以太网接口设计中GMII与RGMII时序转换的三种实现方案,包括Xilinx官方IP核、手工原语逻辑和开源方案gmii_to_rgmii。通过对比分析各方案的优缺点和适用场景,为工程师提供技术选型指南,帮助避免常见设计陷阱,提升高速网络设备开发的效率和可靠性。

weixin_42570484的博客 382

抖音自定义卡片链接(图文链接)

抖音自定义可以自定义标题,打开链接,和展示图片 效果 主要代码 public void sendMessage(String conversationId, Object aBaseContent) throws Exception { // C233282u5.LIZIZ.LIZ().LIZIZ(LIZ).LIZ(obtain).LIZ(hLn).LIZ((AbstractC59811HHc) new H9Q()); Object HOa = ReflectionUtil

傅恒的博客 4140

linux asio网络编程理论及实现

在本篇博文中,主要梳理了asio多线程网络编程其中一种方案的实现及理论。在写的时候发现了一点问题,就是说server管理了session节点,但是我看析构的时候,并没有将所有节点删除。而是在main函数捕获信号,然后通过io_context池子来stop了所有的io_context,让io_context.run()立即返回,并且回收了所有的线程.但是io_context.run()返回了也就是内部的epoll不在epolll_wait了是否就可可以使管理的session是否不用移除,回头再看一下代码吧。

m0_64060063的博客 1513

最新版 Akamai 逆向 风控破解

经过测试,捷星 jetstar.com,德州仪器 ti.com,w6 wizzair.com,还有一些航空公司的都是可以实现一个并发的有需要的可以。

m0_72605044的博客 6619

高并发系统设计

作者:周顺利 注:本文大多数观点和代码都是从网上或者开源代码中抄来的,为了疏理和组织这片文章,作者也费了不少心血,为了表示对我劳动的尊重,请转载时注明作者和出处。 一、     引子 最近失业在家,闲来无事。通过网上查找资料和查看开源代码,研究了一下互联网高并发系统的一些设计。这里主要从服务器内部设计和整个系统设计两个方面讨论,更多的是从互联网大型网站设计方面考虑,高性能计算之类系统没有

厚积薄发的博客 2074

Docker安装并运行AnythingLLM的详细教程

通过本文的介绍,你已经掌握了如何在 CentOS 系统上使用 Docker 安装并运行 AnythingLLM。AnythingLLM 提供了强大的功能,支持本地知识库搭建和多模态输入,非常适合个人和企业使用。希望本文能帮助你快速上手并搭建自己的 AI 知识库。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 5846

matlab 基于离散余弦变换DCT的最小二乘相位解缠

最小范数法是寻求在解包裹相位的局部微分与包裹相位微分相一致的条件下, 逼近于真实相位分布的解包裹相位分布。目标是使解包裹相位与包裹相位曲面的差最小

点云侠的博客 285

Reactor,Proactor,Actor

Actor proactor reactor

jjyy2333的博客 595

优化翼型形状的遗传算法实现

在每一代种群中,通过计算每个个体的适应度值,选择具有较高适应度值的个体,并使用交叉和变异算子对它们进行操作,从而生成新的个体。具体而言,我们将采用一个参数化的翼型模型,其中包括几何设计变量,如角度、弯曲和厚度等,以及性能指标,如升阻比和扭矩等。总之,本文提供了一个基于遗传算法的优化方法,用于寻找最优的翼型形状,并提供MATLAB源代码。需要注意的是,上述代码中的objFunc函数是一个示例性质的目标函数,实际应用中需要根据具体的问题进行修改。1.初始化一个随机的种群,其中每个个体代表一个参数化的翼型模型。

与其临渊羡鱼,不如退而结网 517

深入理解Linux高性能网络架构的那些事!

1. 落寞的小黑 上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信: 于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。 小黑: 你今天下班挺早呀! 大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。 明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。 大白: 下午去面的哪家?啥岗位?咋样? 小黑: 是一家做自动驾驶的创业公司,网站是看团队介绍还不错,就去看看了,这次没咋准备,很多问题其实都熟悉,但

wubaohu1314的博客 296

Cadence Orcad Capture原理图断线的检查与避免方法

在设计电路图中,尤其是直接借鉴别人的设计进行二次开发的过程中难免会遇到如下尴尬的情况。有没有眼神好的朋友发现图纸的哪里有不对劲的地方呢?

fydar的博客 3269

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

图解|深入理解Linux高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟...

架构师小秘圈 709

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

boost asio 性能_图解|深入理解Linux高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。大白: 下午去面的哪家?啥岗位?咋样?小黑: 是一家做自动驾驶的创业公司,网站是...

weixin_29767773的博客 594

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

嵌入式网络那些事_图解|深入理解Linux高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。大白: 下午去面的哪家?啥岗位?咋样?小黑: 是一家做自动驾驶的创业公...

weixin_39966602的博客 247

图解|深入理解Linux高性能网络架构的那些事(并发消息处理模型)

1. 落寞的小黑 上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信: 于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。 小黑: 你今天下班挺早呀! 大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。 明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。 大白: 下午去面的哪家?啥岗位?咋样? 小黑: 是一家做自动驾驶的创业公司,网站是看团队介绍还不错,就去看看了,这次没咋准备,很多问题其实都熟.

WXXGoodJob的博客 1111

boost asio 性能_图说 Linux 高性能网络架构的那些事

1. 落寞的小黑上周北京很冷,周五晚上大白下班奔地铁站,收到了好基友小黑的微信:于是大白掉头扫了个单车奔五道口了,小黑靠谱地选了个不错的位置。小黑: 你今天下班挺早呀!大白: 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。明显能感觉得到小黑哥最近好像比较累,之前眼里bulingbuling闪的光是看不到了。大白: 下午去面的哪家?啥岗位?咋样?小黑: 是一家做自动驾驶的创业公...

weixin_39842744的博客 156

解析Linux网络模型与Redis的高性能网络架构

基于Linux网络模型,解析Redis的高性能实现

BUPTZhanggg的博客 708

【免费下载】 探索Linux内核网络世界的神秘面纱 ——《深入理解Linux网络技术内幕(中文版)》

探索Linux内核网络世界的神秘面纱 ——《深入理解Linux网络技术内幕(中文版)》 【下载地址】深入理解Linux网络技术内幕中文版资源下载 本仓库提供了一份名为《深入理解Linux网络技术内幕(中文版)》的资源文件下载。该文件详细介绍了Linux网络技术的内部工作原理,并附带了完整的目录标签,方便读者快速定位和查阅...

gitblog_09737的博客 640

DockerLabs项目:深入理解Linux网络命名空间

在现代容器化技术中,网络隔离是确保应用安全性和稳定性的关键技术。你是否曾经遇到过这样的场景: - 多个容器需要使用相同的端口但互不干扰? - 需要为不同应用创建独立的网络环境? - 希望模拟复杂的网络拓扑进行测试? 这些问题的核心解决方案就是**Linux网络命名空间(Network Namespace)**——Docker等容器技术的网络隔离基石。 通过本文,你将获得: - ???? 网络命名...

gitblog_00631的博客 383

InfiniBand协议深度解析:RDMA的原生网络架构

本文深度解析InfiniBand(IB)协议栈,揭秘其作为RDMA原生网络架构的核心机制。从六层网络模型到三段式报文结构,详细剖析链路层的基于信用流控与传输层的QP机制,并探讨子网管理器(SM)在全局路由中的“大脑”作用。结合实战命令,带你全面掌握IB网络配置与调优,助力构建高性能算力集群。

专注分享DPU、RDMA智能网卡/SSD(固态硬盘)产品测试与优化 485
上一篇: TCP/IP拥塞控制总结...
下一篇: 深入理解Linux socket
废言Pro
博客等级 码龄16年 1093粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值