摘要:
最近在做一个MSMQ的Agent服务,在这里分享一下这个服务在优化的一点经验,通过分析内存更准确地定位出程序中存在的性能问题,从而让程序的性能以倍数的提升.问题的引发由于通过.NET MSMQ的Client实现消息分布和故障转移实在测试效果并不理想..所以决定实现一个MSMQ的Agent服务,由于有网络编写的经验所以对实现的效果还有很有信心的.可惜最终实现出来的效果实在惨不忍睹...4个连接并发消息写入只有150/秒,实在是完全坑爹的结果!在架构上的设计并不存在问题,所以问题一定存在程序实现过程中,以往的经验告诉自己做内存分析是最直接的办法.问题排查一Buffer没正常回收到Pool由于在测试 阅读全文
摘要:
Log4net内置了很多Appender但似乎找不到基于Http.在应用希望在本地保存日志的同时也可以把日志提交到一个Http服务中用于统一跟踪管理.如果每记录一次日志都提交给Http服务那对于应用端来说连接的创建是件很损耗性能的事情.由于日志不需要实时同步性,在设计上可以通过定时或当内存日志到达一定数量的时候才进行提交,这样就不会出现频繁提交日志带来的性能问题.功能定义Log4net实现一个Appender是一件比较简单的工作,只需要实IAppender接口即可以,当然Log4net也会提供一些基类方便我们实现.接下来我们实现一个httpAppender.在实现之前需制定一些参数用于内部实现 阅读全文
摘要:
在Beetle.Express1.2中加了UDP支持,而整体的设计结构也做了调整.只需要通过简单的配置就能实现高吐的TCP&UDP应用.由于组件引用UDP服务同样也支持会话状态所以对于服务是TCP或UDP对使用者来说完全是透明的.使用者只需要关心以下几个接口即可:IServer(服务描述接口),IChannel(通道会话),IData(发送数据描述),IReceiveData(数据接收描述)和IServerHandler(服务处理接口).而使用在使用组件的时候只需要实现IServerHandler.IServerHandler该接口主要用于描述相关服务的工作,包括连接接入,连接释放,数 阅读全文
摘要:
当你在写一个网络应用的时候,往往需要一个压力测试工具对应用基础的网络吞吐支撑能力进行一个测试;看一下服务在不同连接不同请求下的处理效能.下面就为大家介绍一个基于.net实现的网络吞吐测试工具,这个工作可以简单地测试TCP或UPC服务网络吞吐的处理效能,而使用起来也是非常方便.测试前配置工具可以对TCP和UDP进行一个压力测试,测试配置很简单只需要填写相应服务的IP地址和端口,并设置压力测试的连接数和发送相关数据即可.测试有两种方式分别是:应用答模式和间隔模式;应用答模式即是当发送请求得到服务器回应后立即发送下一次请求,而间隔模式即每隔多少时间向服务器发送一个请求数据.发送数据设置发送的数据可以 阅读全文
摘要:
在做网络应用的时候经常要处理不处于活动的连接,对于不活动的TCP连接可以通过设置KeepAlive来触发SocketError来处理掉.但有更多的时候是使用ping和pong来处理.对于ping,pong这种做法的发起者有两种情况,分别是由server或client发起.对于由服务器发起比较损耗资源毕竟每隔一段时间都要向整个连接列发送ping,当累计到定数量没得到pong回应用的时候杀死;而对于Client发起的话server只需要记录ping时间即可,隔一段时间没有得到ping的client杀死.但两种做法似乎都要对连接列表进行一次扫描,存在大量活动连接的时候这种做法似乎并不理想. ... 阅读全文
摘要:
在写任何一个东西的时候都想知道实现后的性能到底怎样,一般情况下可以通过一个简单的计时来确定性能是好是坏.但对于编写网络应用来说确定这东西性能怎样相对比较复杂一些,有的人会用是否能达到某个带宽值或是否支持多少连接来确定这性能好不好.在和很多朋友交流的过程发现他们对这方面的了解存在一些误区,误认为只要把千兆带宽跑满或都支持多少个连接接入就行;其实通这两值来确定一个服务的性能好不好是否可靠呢?下面通过一些测试来看这两个指标值来衡量性能的可靠性.带宽对于.NET程序来说跑满千兆带宽可以说是一件容易的事情,也可以说是一件非常困难的事情.以下是100个连接从服务端获取不同数据块的测试结果.分别测试了获取不 阅读全文
摘要:
当在更新应用的时候是否碰到以下烦琐的工作[停址服务-更新服务-启动服务];的确由于文件被程序占用所以在更新文件的时候必须把程序停止,更新完成后又手动启动.而KGlue就是为了解决以上问题而出现的,它的主要作用是使用appDomain来加载运行每个配置的应用;监控相关应用文件变化自动对应用进行卸载和重启动的服务功能.简单而言在更新应用的时候直接替换文件后,KGlue就会对程序进行重新加载.使用配置KGlue可以配置多应用程序,应用程序可以存放在KGlue能访问的任意目录下.只需要简单地在配置文件中添加相关应用目录即可.<?xml version="1.0" encodi 阅读全文
摘要:
本章节主要讲述如何使用Smark.Data 1.8进行快速的数据库应用开发,主要内容包括配置,执行SQL和存储过程等基础的数据操作.配置在组件使用之前必须进行一个初始化配置,主要配置数据访问设备和对应的数据库的连接信息.组件可以通过两种途径来进行数据配置分别是配置文件和代码.Config配置 <configSections> <section name="smarkdata" type="Smark.Data.SmarkDataSection,Smark.Data"/></configSections> <sma 阅读全文
摘要:
Smark.Data一直强调以最简单和高效的方式访问数据库,在这个版本中组件引入了Query<T>对象,它是一个查询值描述对象,通过它可以更方便地进行数据查询并获取结果.组件会分析T的具体类型自动选择查询方式进行操作;在应用的时候可以直接通过Query<Employee> item=3;的方式直接得到查询数据.因此对使用者来说是一种全新方便灵活的数据库操作途径. T类型和设置值分析组件会把T类型分为三种类型,第一种是返回值类型或string,第二种是实体类型,第三种是实体列表IList<T>.组件会根据这几种类型会初始化不同加载器.T类型会根据设置的值选择执 阅读全文
摘要:
最近打算用Redis用在产品中,所以相应会用到Redis .net client.由于自身也是写网络应用方面的所以自然就想了解一下代码看写得怎样.在打开代码的时候第一眼发现比较熟悉的一个对象BufferPool.打开一看发现设计比较特别,在整个Pool的获取和回收上没有用于我们常用的锁对象,也没有用于.NET带的轻量级的自旋锁.而是通过.net提供的原子锁来实现一个简单的自旋锁. /// <summary> /// Courtesy of @marcgravell /// http://code.google.com/p/protobuf-net/source/browse/t.. 阅读全文