




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.:.;.NET Remoting Server 性能分析及利用Loadrunner进展性能测试的方案1概述 |,jOnGf .NET Remoting 被誉为管理运用程序域之间的 RPC 的首选技术。运用程序域是公共言语运转库的隔离单元,它们是在进程内创建并运转的。这与 CLR 和非 CLR 托管的进程之间的进程间通讯互操作不同。后一种类型的 RPC 通讯特别是 Web 上的普通被以为是 Web 效力领域的问题。遗憾的是,这种看似清楚的区分,却由于可以在 IIS 下集成 .Net Remoting 效力器而变得模糊,“经过在 IIS 中集成 .NET Remoting 对象,可以将其作为一种
2、 Web 效力提供 e=;X!oe b !=F.|Q 9kL 9Q Remoting, 简而言之,我们可以将其看作是一种分布式处置方式。从微软的产品角度来看,可以说Remoting就是DCOM的一种晋级,它改善了很多功能,并极好的融 合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象经过运用程序域与另一对象进展交互的框架。这也正是我们运用Remoting的缘由。为什么呢?在Windows操作系统中,是将运用 程序分别为单独的进程。这个进程构成了运用程序代码和数据周围的一道边境。假设不采用进程间通讯RPC机制,那么在一个进程中执行的代码就不能访问另一 进程。这
3、是一种操作系统对运用程序的维护机制。然而在某些情况下,我们需求跨过运用程序域,与另外的运用程序域进展通讯,即穿越边境。其主机与客户端的主 要义务如下: ipafJJ , Mi,dyZ5 主机义务 H =Km) 9$5| 设计效力,选择运用程序域、激活方式、通道、端口和发布。 6#&N&k C%dNTEwd 实现 Remoting 主机运用程序域例如 IIS/系统效力。 y&+4FC9U-d TY+BUHD 配置主机激活、通道和协议设置。建议运用配置文件,可以经过调用 RemotingConfiguration.Configure 加载。 0Sgn Vza 发布接口,供客户端运用有关详细信息,请
4、参阅下文中的“接口发布选择。 QXqkN y= /5rXK 客户端义务 5AL/Xix, | h/-;DCd 设计客户端,选择运用程序域和激活方式。 hhV!3* qE%li6 思索能否需求注册通道和端口。 r*0/6/3 ot YhK?+ 获取远程类型元数据。 g7Z OGM NqM?m 实现客户端运用程序域。 9 *v!1 rdi-|6U 配置客户端激活方式和其他类型的信息,如运用程序称号、通道和对象 URI 等。建议运用配置文件,可以经过调用 RemotingConfiguration.Configure 加载。 yb*!?dA Hbt-m 2 Remoting 处理方案的过程中能够会遇
5、到的错误情况 W&)giI 在 任何情况下,都应该记住要运用规范的设备运用和监视方法。事件记录仍是非常有价值的信息资源,就象网络监视器工具一样,网络监视器可以专门用于详细查看客 户端/效力器的 Remoting 会话。中间层的 Remoting 效力器仍可以运用 Visual Studio .NET 提供的规范调试工具进展调试,例如,对于由 IIS 集成的 Remoting 效力器,可以经过向 ASP.NET 辅助进程附加调试会话Visual Studio .Net | Debug 调试 | Processes 进程 | Attach 附加 来设置断点假设资源可用。但 Remoting 的错误
6、很独特,下面列出了一些。请留意,一切错误都已运用 .NET Framework SDK 提供的 Basic Remoting Hello Sample 的各版本进展了复现,效力器和客户端也已在单机上运转。缺点景象与在网络链接上的一样,只是由于 /TCP 的超时设置不同,需求相当长的时间才干出现错误。 TgRNW clbPrDkx 2.1丧失 MarshalByRef u 对于效力器激活,Remoting 效力器将其侦听处声明为端点。该端点普通包括一个对象 URI远程对象的众所周知称号,一个协议和一个端口号。当然,一切这些都能够配置错误。 AWllny ;b+GMp 2.3错误的 URI ,kw
7、U5 由效力提供的 Basic Remoting Hello Sample 的 URI 是 HelloService.soap,如相关的 web.config 文件中所指定: qMF;/z m2I U;T/,P9G ;4fAUn8 wgHSuU?c HY-0YUQ &JzwU) n7YC FVYT5,i too =UZzX+5! G$isM =+ ys0m/V8 Ff UDm fU5e/Z$ -/1R.Q snp+aQ%P XQhDWq z| E9c,? -q,GOJ 此 效力是 IIS 集成的。IIS 集成要求 URI 带有后缀 .rem 或 .soap,我们在效力器上运用 .rope。在此
8、实例中,我们将再次收到 RemotingException,这次显示的文本是“对象 在效力器上已断开或不存在。 kA!*|. .f n)( 请确保各个 URI 相互匹配!当 IIS 集成 Remoting 效力器时,还要确保 URI 以 .rem 或 .soap 结尾。 kaH hd q!bz% 为了进展此项测试,我们切换到控制台集成的效力器,以下是该效力器的配置文件: afk=Zg h#EuXo %8gf7 uAZCgF 8.8: $ ;OfPvo FHHjA1K 7yINrdpRd /wm 7wq 2_ u(WKf 8SM?sPQ - ZM b;LAafqI |M55iUjwg +,56z
9、t *?aL_a3r |,yILE. h%!_jt1 OdsNB_dk kbwNG pPw HSRJCwj| ck;ri g5) r8 S?43/T% 8GU9/9V 假设我们要在效力器端将协议更改为 TCP,而使客户端保管 。 0$%W =O;&28 我们将再次收到 RemotingException,这次的文本是“底层衔接已封锁:接纳时出现不测错误。 HNJg C&-%#: 端口设置错误也会导致上述异常,独一的不同是这种情况下,要用较长的时间才会出现错误。效力器和客户端之间的端口和协议必需匹配。 r /d$ wLwIk_q 2.5丧失 URI I)5AK* 另 一种能够性是远程效力器没有运
10、转,例如,效力器由 IIS 集成,而虚拟运用程序或相关的程序集丧失。再次运用 Basic Hello Remoting 效力器,我们需求虚拟运用程序 RemotingHello 可以运转。假设不能运转,我们将收到未处置的异常取决于调用代码,但这次的异常将是:“无法加载类型 clr:Hello.HelloService, Hello。 W$)Z; kDB JP 在这些情况下,请确保虚拟运用程序在运转,而且所需的程序集正确地放置在相关的 bin 子文件夹中。 *)Ae sB bLtq 总而言之,客户端必需正确地援用效力器定义的端点以便激活效力器,这意味着,端口、协议和 URI 的定义必需相互匹配。
11、这太容易出错了。因此,假设效力器的位置定义为: saLqSLw DO! zzuA#Z6e 0#lLuj LbV pW & 7 2|gSq 2ssYy!#s 那么,客户的设置必需为: sI?5ysgJ nAd(?c c77!( ?!tVotJ 78RC _b; 5 !4;9G2KQ Ps0uGTjT 其中,URL 表示集成 Remoting 效力的 IIS 虚拟运用程序,类型表示类和程序集称号。 5.IdfiY nALTvtZs 3 Remoting 的特点 aK$P# 3.1 优点 9 -o -bL 他的优点是用户既可以运用TCP信道方式进展二进制流方式通讯,也可以运用HTTP信道进展SOAP
12、格式的性通讯 2LmJ_o zo_BY, 效率相对WebService要高不少;但是它的缺陷也很明显,.net remoting只能运用于MS 的.net framework之下。 73;xC+x zin$KEQ4 从性能上来讲Remoting的效率和传统的DCOM、COM+的性能很相近。 fW:3ud U_224rz0 3.2 缺陷 $s&*A 这种三层设计的缺陷与运用 XML Web service 的三层设计的缺陷一样。 G&zoQ9 6-4a4, 一切业务规那么均包含在前端代码中。因此,假设需求更改业务规那么,那么必需更新全部客户端。除非可以进展自动更新,否那么这种维护任务将非常繁琐。
13、当然,假设运用 SQL Server,那么可以将某些业务规那么放到存储过程中,从而减少维护的时间和本钱。 Zl?/n2|? CKyf$ZJ 一切字段称号均在源代码或控件属性中硬编码。假设更改字段称号,那么必需查找和交换运用程序中一切该字段的称号。假设运用了数据绑定,还必需检查一切窗体并更改属性。 0kHjin aZKv;/ 经过网络从一个组件向另一个组件传输数据比直接衔接数据库要慢。在 Intranet 方案中,.NET Remoting 的性能比 XML Web service 要好。而在 Internet 方案中,普通不运用 .NET Remoting。 Ch$I#j B;oJV)-m 建
14、立这种运用程序比建立两层运用程序或运用 XML Web service 的运用程序要复杂一些。 +IRPXH_ 4uoWH!zQ+T 必 须运用比 TCP 速度慢的 。另外,IIS 能够循环执行 ASP.NET 辅助进程,这将破坏一切 Singleton 的形状。对您来说,这能够是问题也能够不是问题,要取决于您的设计需求,由于客户端的下一个调用将重新启动 Singleton。您可以将 IIS 配置为不循环执行辅助进程,但这种才干很有限,特别是在 IIS 5 中,而且能够呵斥更进一步的影响。这里最根本的意思是,假设要求远程效力器的平安性,那么无疑要运用 IIS 集成。 A&y-c 1b w-Xx
15、 XXv 所 以,在实践做工程的过程中,我更倾向于先调用本地的对象,等调试胜利后,再翻开Remoting效力,调用远程对象,验证能否正确。举例来说,我要提供访 问数据库的远程对象。我会先让该对象在本地运转,并调用其方法。假设一切正常,阐明数据库的配置和衔接均是正确的。然后再将该调用交换为远程对象。假设程 序出错,那么可以一定是Remoting提供的效力出错了,或者是远程对象未按照Remoting的规定,没有派生MarshalByRefObject, 或者未提供序列化特性。 $KKVAfEM ?Q4(|&w$o Bn1/ r.4X| 3f,OvP, switch (invokeMode) pgB
16、9&kvY DF- Et case InvokeMode.Local: 5x!RwQ,l serviceObj = new DBAccessService(); %xpm break; %-|YF| case InvokeMode.Remoting: ufNhp serviceObj = (DBAccessService)Activator.GetObject(typeof(DBAccessService),tcplocalhost:8080/DBAccessService); %H*ANEu,!# break; V 5xUG6 Eetymx ggn$ljFW private DBAccess
17、Service serviceObj = null; jJ(J)% ni m0 如此这般,在客户端调用对象时,就可根据设置构造函数中的参数枚举值,灵敏地改动客户端调用对象的方式。 :wR?T!4 ($:-.gQs2 其实这种方法也可以用简单工厂方式来完成。不过这个简单工厂消费的产品和通常意义的工厂方式有点不一样哦,由于他们的产品其实是完全一样的。不同的仅仅是创建对象的方式而已。 V?0DDZZH M&.og0 public class SimpleFactory ixG_4x ;p e/X public static DBAccessService CreateInstance(InvokeM
18、ode invokeMode) l$1|ql?= switch (invokeMode) QB/OC b& *8*L4v_d case InvokeMode.Local: *+:AH return new DBAccessService(); dZo _* break; r*+: case InvokeMode.Remoting: 0/,dZT)W return (DBAccessService)Activator.GetObject(typeof(DBAccessService),tcplocalhost:8080/DBAccessService); kiZ#Xt break; Qy_e|U
19、 QT 0y (e&D/|7R W9b_4r dY.-ia Zns 然后再调用工厂的静态方法,来获得该对象即可。 7:4 ; W_xTki 两种方法都是一种思想:就是根据需求,选择不同的创建方式其实前一种方法也可以看作是简单工厂方式的一种变种。假设只需一个要创建的对象,选前者更为方便;假设需求创建多个对象,用工厂方法提供多个静态方法,应该要灵敏一些。 $x(zgKQR /9FxMNR 经过上述方法,不仅便于调试,也便于以后代码的修正。假设取消运用Remoting,只需改动参数枚举值即可,其他代码统统不用改动。这个技巧也算是设计方式的一种最简单运用吧。 v/|WtW FWMOhvF-x 5 测试
20、方案 XAujKXQ 分布式运用程序中进程间通讯的性能取决于以下要素: 9Br( X |a-9/_K 用于跨远程边境的运用程序间传输信息的通道包括 TCP 和 占用的系统开销量。TCP 套接字比 更为有效。 |uaQ? f0p2CkH Remoting 分别运用 BinaryFormatter 和 SOAPFormatter 将对象序列化为二进制格式和 SOAP 格式。由于这些格式化程序运用反射,因此对于援用对象很快,但对于必需经过装箱或取消装箱来经过反射 API 传送的值类型那么较慢。此外,SOAPFormatter 还需求额外的系统开销以生成编码的 SOAP 音讯。 %yR6# gC .C
21、n#QB* 我们运用测试基于访问客户和订单数据的普通业务方案。为使测试尽能够符合实践,数据库中包含 100,000 多行客户帐户。数据位于 Orcale 数据库中。 ? QeZ_-6 D=.8q hC 测试过程中,我们逐页提取不同类型客户行集合,然后查询商品,填写完销售订单后,提交保管。在这个过程中,用LR模拟100虚拟用户同时进展操作,检测系统呼应时间及其他性能参数。 snMRZ$h1* 8MCy 6 测试工具和战略 TZ 6.1 工具简介 J!s=d k 在 本测试中,我们运用了 MI 公司的loadrunner。它可以对 Web 效力器进展强度测试,分析 Web 运用程序包括 ASPX
22、页及其运用的组件的性能和可伸缩性问题。有关如何创建和运转测试的详细信息,请参阅loadrunner运用手册。经过翻开到效力器的多个衔接并迅速发 送 恳求,loadrunner可以模拟一大组用户。它还允许我们建立实践的测试方案,我们可以在方案中运用一组随机参数值调用同一个方法。此功能很重要,因 为用户不能够会运用一样的参数值反复调用同一个方法。另一个有用的功能是,loadrunner可以记录测试结果,然后进展分析,从而提供有关 Web 运用程序性能的最重要的信息。 8 ePt | #kUm$L 6.2处理Loadrunner中没有相关Remoting协议的问题 )3+OVH 因 为在C/S 的
23、ERP系统中,LR并没有remoting相关协议可以选择,直接导致了LR无法录制操作步骤,获得脚本程序。处理这种情况有一种方法,即:去 MERCURY官方站点去下载一个基于.NET Remoting的add-in的补丁包,把此包集成于.NET C#开发环境中,这时,开发环境上方工具条会出现一个Vuser的新控件见以下图。我们调入被测源程序,然后在其中创建一个Loadrunner的新项 目,然后根据被测对象,在开发环境中写出测试代码。最后利用Vuser项创建LR的场景,它会自动调用LR去做,设置终了运转即可。当完成场景运转之后, 利用LR的Analysis工具进展分析即可。 FG;Zi3y ;r
24、0;c 38tFilA 7 LR计数器简介 8w8p| Memory: QEK AKc L2m bGy 内 存运用情况能够是系统性能中最重要的要素。假设系统“页交换频繁,阐明内存缺乏。“页交换是运用称为“页面的单位,将固定大小的代码和数据块从 RAM 挪动到磁盘的过程,其目的是为了释放内存空间。虽然某些页交换使 Windows 2000 可以运用比实践更多的内存,也是可以接受的,但频繁的页交换将降低系统性能。减少页交换将显著提高系统呼应速度。要监视内存缺乏的情况,请从以下的对象计 数器开场: dixnn0z &SY d Available Mbytes: ELgHH7qs TKBC06, 可用
25、物理内存数. 假设Available Mbytes的值很小4 MB 或更小,那么阐明计算机上总的内存能够缺乏,或某程序没有释放内存。 kv6YOt: vDn0RN%w page/sec: :3QU c* sv- 表 明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放任务集空间的页面数。普通假设pages/sec继续高于几百,那么您应该进一 步研讨页交换活动。有能够需求添加内存,以减少换页的需求他可以把这个数字乘以4k就得到由此引起的硬盘数据流量。Pages/sec 的值很大不一定阐明内存有问题,而能够是运转运用内存映射文件的程序所致。 k;W(y 5. 越低越好。大数值表示
26、磁盘读而不是缓存读。 KvjG+_2U (T1WKeY 由于过多的页交换要运用大量的硬盘空间,因此有能够将导致将页交换内存缺乏与导致页交换的磁盘瓶径混淆。因此,在研讨内存缺乏不太明显的页交换的缘由时,必需跟踪如下的磁盘运用情况计数器和内存计数器: IAp7,5y RPQEjk+ Physical Disk % Disk Time 、Physical Disk Avg.Disk Queue Length 例如,包括 Page Reads/sec 和 % Disk Time 及 Avg.Disk Queue Length。假设页面读取操作速率很低,同时 % Disk Time 和 Avg.Disk
27、 Queue Length的值很高,那么能够有磁盘瓶径。但是,假设队列长度添加的同时页面读取速率并未降低,那么内存缺乏。 nphAnVOb yurTY 要 确定过多的页交换对磁盘活动的影响,请将 Physical Disk Avg.Disk sec/Transfer 和 Memory Pages/sec 计数器的值增大数倍。假设这些计数器的计数结果超越了 0.1,那么页交换将破费百分之十以上的磁盘访问时间。假设长时间发生这种情况,那么您能够需求更多的内存。 6By?T Qxo:t0d Page Faults/sec: MyPfL ohcV 每秒软性页面失效的数目包括有些可以直接在内存中满足而有
28、些需求从硬盘读取较page/sec只阐明数据不能在内存的指定任务集中立刻便用。 1R87 osv=44_ Cache Bytes: 99W7=8i Sf/7.H 文件系统缓存File System Cache,默许情况下为50%的可用物理内存。如IIS5.0 运转内存不够时,它会自动整理缓存。 Wlo%QlZn 6TNwN 需求关注该计数器的趋势变化 4R-L :faf/UEfQ 如 果您疑心有内存泄露,请监视 Memory Available Bytes 和 Memory Committed Bytes,以察看内存行为,并监视您以为能够在泄露内存的进程的 ProcessPrivate Byt
29、es、ProcessWorking Set 和ProcessHandle Count。假设您疑心是内核方式进程导致了泄露,那么还应该监视 MemoryPool Nonpaged Bytes、Memory Pool Nonpaged Allocs 和 Process(process_name) Pool Nonpaged Bytes。 Xr)fbL1 )hg_*0U Pages per second : zTI68r pDG0_ 每秒钟检索的页数。该数字应少于每秒一页。 )1c%S N1dcLQ1/Oz Process: &ufc3$Ur( x ;EoMqQ %Processor Time: %
30、aI_N x Uv%l 被处置器耗费的处置器时间数量。假设效力器公用于sql server,可接受的最大上限是80-85% 3+A6iAK- zif00=% Page Faults/sec:将进程产生的页缺点与系统产生的相比较,以判别这个进程对系统页缺点产生的影响。 )7EZk=|! GSNv_Zk Work set: a1X a9F-PM 处置线程最近运用的内存页,反映了每一个进程运用的内存页的数量。假设效力器有足够的空闲内存,页就会被留在任务集中,当自在内存少于一个特定的阈值时,页就会被去除出任务集。 c%vn T:bsB CibAtff Processor:监视“处置器和“系统对象计数器
31、可以提供关于处置器运用的有价值的信息,协助 您决议能否存在瓶颈。 1/W;H N2l 2;:* 29_E %Processor Time: OD5nEfX cU&:Ma*hn 假设该值继续超越95%,阐明瓶颈是CPU。可以思索添加一个处置器或换一个更快的处置器。 ?nim!%WjQw xN9!)SNx %User Time: u/&Es5l j FY%Ew 表示耗费CPU的数据库操作,如排序,执行aggregate functions等。假设该值很高,可思索添加索引,尽量运用简单的表联接,程度分割大表格等方法来降低该值。 ?5GT*R yAXn*Jp/ %Privileged Time: YX
32、Og:FY UWZ +7d2 CPU 内核时间是在特权方式下处置线程执行代码所花时间的百分比。假设该参数值和Physical Disk参数值不断很高,阐明I/O有问题。可思索改换更快的硬盘系统。另外设置Tempdb in RAM,减低max async IO,max lazy writer IO等措施都会降低该值。 U?UG_oU XEK8 此外,跟踪计算机的效力器任务队列当前长度的 Server Work Queues Queue Length 计数器会显示出处置器瓶颈。队列长度继续大于 4 那么表示能够出现处置器拥塞。此计数器是特定时间的值,而不是一段时间的平均值。 1U4b7 G*rtY
33、 % DPC Time: g4unab h DIMZhH/ 越低越好。在多处置器系统中,假设这个值大于50%并且Processor:% Processor Time非常高,参与一个网卡能够会提高性能,提供的网络曾经不饱和。 GWMs%hwY -2% Process z)F=I8 WtH)LlW % Processor Time 指这个线程运用途置器执行指令的所用时间的百分比。类似于Processor的% Processor Time ;gLse- PaWj % Privileged Time 指这台处置器的线程用于执行在特权方式中的代码所经过时间的百分比。类似于Processor的% Priv
34、ileged Time jD4Wy4! ;n lk* % User Time 指这台处置的线程用于执行运用用户方式的代码的时间的百分比。类似于Processor的% User Time wRg94 C9 09R=% Private Bytes 指这个处置不能与其它处置共享的、已分配的当前字节数。假设此数值随时间不断增大,有能够是内存走漏。 =bL :xT7 b$w-*t Virtual Bytes 指处置运用的虚拟地址空间的以字节数显示的当前大小。运用虚拟地址空间不一定是指对磁盘或主内存页的相应的运用。虚拟空间是有限,假设运用过多,能够会限制处置加载数据库的才干。 N*|H5W=V Umt4
35、IO Data Bytes/sec 处置从I/O操作读取/写入字节的速度。这个计数器为一切由本处置产生的包括文件、网络和设备I/O的活动计数。 +AtBzG- UQq8o6 v Processor 3fYD 6fi,RI= % Processor Time 指处置器执行非闲置线程时间的百分比。这个计数器设计成用来作为处置器活动的主要指示器。它经过在每个范例间隔中衡量处置器用于执行闲置处置线程的时间, 并且用100%减去该值得出。(每台处置器有一个闲置线程,该线程在没有其它线程可以运转时耗费周期)。可将其视为范例间隔用于做有用任务的百分比。这个 计数器显示在范例间隔时所看到的忙时平均值。这个值是
36、用100%减去该效力不活动的时间计算出来的。 Vd|e0 GA vFApX$ 正常值90,此值过大表示处置器的性能曾经不能应付程序的要求,要换更快的处置器。 E u7t, bx V5R-n % Privileged Time 指非闲置处置器时间用于特权方式的百分比。(特权方式是为操作系统组件和支配硬件驱动程序而设计的一种处置方式。它允许直接访问硬件和一切内存。另一种模 式为用户方式,它是一种为运用程序、环境分系统和整数分系统设计的一种有限处置方式。操作系统将运用程序线程转换成特权方式以访问操作系统效力)。特权时 间的%包括为延续和DPC提供效力的时间。特权时间比率高能够是由于失败设备产生的大数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清新知春 - 工作总结
- 绿化补植合同范本
- 开学季全国中小学生安全教育日给家长的一封信
- 硕士论文答辩模板
- 采购氨水喷枪合同范本
- 花卉购销养护合同范本
- 个体管材加工合同范本
- 2025地下矿井配电工程师合同通知书
- 2025合同类型解析(固定期限合同、无固定期限合同、退休前合同与退休后合同)
- 2025马鞍山市住宅装饰装修工程施工合同马鞍山市工商行政管理
- 中国肉牛产业链分析报告
- 危险化学品物质安全告知卡(硫化氢)
- 农田面源污染防治技术指南
- 电气系统设计方案
- 腰椎术后脑脊液漏的护理课件
- SMI发展历史简介
- 高杆灯专项施工方案
- 钢笔字练习模板
- 柠檬茶项目财务数据分析(参考范文)
- 车间员工质量意识培训
- 乡村旅游-课件(PPT演示) (1)
评论
0/150
提交评论