我用Web API做了一个网站,网站很简单,请求就是几个普通的参数,提交到服务器后,在Web API里做一下参数验证,然后去访问Redis里的TIME命令,最后把TIME命令返回的结果计算出yyyy-MM-dd HH:mm:ss的形式,返回JSON格式。
每秒请求数:1500次。
CPU占用100%
内存和IO都比较低。

CPU:E5800

内存:4G+2G

硬盘:普通蓝盘500G

各位,有人遇到过这样的情况吗?

--------------------------------------------------------------------------华丽的分割线-------------------------------------------------------------------------------

测试电脑配置:

CPU:I7-3770

内存:4G+4G

硬盘:SSD

系统:Win7 64位

.Net Framework:4.5

IIS配置:版本:7.5,队列长度:5000,Web园:5个。

关于上面提到的问题,很多人的说法都不太一样,我一个一个整理,排名是乱的,大家别介意:

1、大石头:在这个过程里面,Json的序列化和反序列化是非常耗时的,远远超过普通asp.net处理其实

  可以试试。

2、Melas:缓存相同请求的数据

  因为我的数据都是不同的,所以没有办法缓存。

3、肖伦军:微软自带的json,不要用第三方的。

  可以试试。

4、泥水佬:json也不会差到这程度的,除非服务器配置很低

  不到万不得已,我不愿意考虑硬件的问题。

  很久以前,在泥水佬的建议下,我用了jetbrains dottrace,测试结果是有一个东西占了百分之九十多的CPU,“ [Native or optimized code] ”,我对这个一直不了解,也不知道这个为什么占这么高的CPU。

根据上面4位的建议,我选择大石头和肖伦军说的json的序列化测试。

源码:

 using System;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.IO;
 using System.Linq;
 using System.Runtime.Serialization.Json;
 using System.Text;
 using Newtonsoft.Json;
 using Formatting = System.Xml.Formatting;

 namespace TestSerializationConsole
 {
     class Program
     {
         static void Main(string[] args)
         {
             Stopwatch timer = new Stopwatch();
             timer.Start();
             List<ApiResult> list = new List<ApiResult>();
             ; i < ; i++)
             {
                 ApiResult result = new ApiResult
                 {
                     Code = i,
                     ErrorMsg = string.Format("当前编号:{0}", i),
                     IsError = (i %  == ),
                     Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                     Guid = Guid.NewGuid().ToString()
                 };
                 list.Add(result);
             }
             timer.Stop();
             Console.WriteLine("共创建{0}项\t共耗时:{1}毫秒", list.Count, timer.ElapsedMilliseconds);
             timer.Restart();
             );
             timer.Stop();
             Console.WriteLine("System.Runtime.Serialization.Json序列化{0}项\t共耗时:{1}毫秒", count1, timer.ElapsedMilliseconds);
             timer.Restart();
             );
             timer.Stop();
             Console.WriteLine("Newtonsoft.Json.dll序列化{0}项\t共耗时:{1}毫秒", count2, timer.ElapsedMilliseconds);
             Console.ReadKey();
         }

         private static string Serialize1(ApiResult obj)
         {
             string jsonContent = string.Empty;
             DataContractJsonSerializer serialize = new DataContractJsonSerializer(typeof(ApiResult));
             using (MemoryStream ms = new MemoryStream())
             {
                 serialize.WriteObject(ms, obj);
                 jsonContent = Encoding.UTF8.GetString(ms.ToArray());
             }
             return jsonContent;
         }

         private static string Serialize2(ApiResult obj)
         {
             string jsonContent = string.Empty;
             jsonContent = JsonConvert.SerializeObject(obj);
             return jsonContent;
         }
     }

     public class ApiResult
     {
         public int Code { get; set; }
         public string ErrorMsg { get; set; }
         public bool IsError { get; set; }
         public string Time { get; set; }
         public string Guid { get; set; }
     }
 }

测试结果:

共创建1000000项 共耗时:1987毫秒
System.Runtime.Serialization.Json序列化1000000项 共耗时:2843毫秒
Newtonsoft.Json.dll序列化1000000项 共耗时:1747毫秒

测试结果证明,不是序列化的问题。

继续测试:

不使用redis,而是直接使用系统提供的DateTime.Now属性,每秒请求数能增加33%

这个结果证明,不是redis的问题。

Web API的CPU占用100%的更多相关文章

  1. w3wp.exe(IIS ) CPU 占用 100% 的常见原因及解决办法

    对于IIS 管理员来说,经常会碰到 Web 服务器 CPU 占用 100% 的情况,以下是个人的日常工作总结和一些解决办法,主要用来剖析 w3wp.exe(IIS )  占用 CPU 100% 的一些 ...

  2. w3wp.exe(IIS ) CPU 占用 100% 的常见原因

    引起 w3wp.exe(IIS ) Cpu 占用 100% 的常见原因如下: 1. Web 访问量大,从而服务器压力大而引起的 2. 动态页面(.aspx)的程序逻辑复杂程度 3. 页面程序中有死循环 ...

  3. 服务器php-cgi.exe进程过多,导致CPU占用100%的解决方法

    再使用iis服务器中经常会出现php-cgi.exe进程过多,导致CPU占用100%,最终造成网站运行过慢甚至卡死的情况,重启iis会好一会,过一段时间久出现这种情况,为什么会出现这种情况呢,应该怎么 ...

  4. 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 CPU 占用 100%的技术笔记》[转]

    转载地址:http://bbs.chinaunix.net/archiver/tid-1823500.html 解决一个 MySQL 服务器进程 CPU 占用 100%解决一个 MySQL 服务器进程 ...

  5. paip.navicat form mysql导入文本文件时CPU占用100%的解决

    paip.navicat form  mysql导入文本文件时CPU占用100%的解决 作者Attilax ,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:h ...

  6. magento 由于Httpd进程增多,导致CPU占用100%问题

    由于Httpd进程增多,导致CPU占用100%问题 magento for version 2.2.3 前些天一直导致CPU无法控制的增多问题. 根据报错我设置了如下内容: [Mysql]mysql. ...

  7. WIN10刚开机任务管理显示CPU占用100%问题

    针对WIN10更新后出现的问题!!! 现象: 电脑刚开机,直接打开任务管理器,CPU占用100%! 但是电脑运行速度正常,按道理这时候应该卡死!(排除病毒) 下载鲁大师查看只是显示CPU 3%!而网上 ...

  8. VPS/云主机CPU占用100%故障排查

    VPS/云主机CPU占用100%故障排查 方法/步骤 通常情况下云主机/VPS的CPU一般不会占用100%,内存资源也不会占完.若您的服务器经常CPU资源100%,可以打开任务管理器,查看是哪个进程引 ...

  9. mysql cpu 100% 满 优化方案 解决MySQL CPU占用100%的经验总结

    下面是一些经验 供参考 解决MySQL CPU占用100%的经验总结 - karl_han的专栏 - CSDN博客 https://blog.csdn.net/karl_han/article/det ...

随机推荐

  1. HDOJ(HDU) 1720 A+B Coming(进制)

    Problem Description Many classmates said to me that A+B is must needs. If you can't AC this problem, ...

  2. SRM468 - SRM469(1-250pt, 500pt)

    SRM 468 DIV1 250pt 题意:给出字典,按照一定要求进行查找. 解法:模拟题,暴力即可. tag:water score: 0.... 这是第一次AC的代码: /* * Author: ...

  3. WKWebview点击图片查看大图

    大家都知道,WKWebview是没有查看大图的属性或者方法的,所以只能通过js与之交互来实现这一功能,原理:通过js获取页面的图片,把它存放到数组,给图片添加点击事件,通过index显示大图就行了 其 ...

  4. fedora19配置 SSH 免密码登陆

    a.ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa b.cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys   ...

  5. IO中同步、异步与阻塞、非阻塞的区别(转)

    转自:http://blog.chinaunix.net/uid-26000296-id-3754118.html 一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步, ...

  6. int.Parse()与int.TryParse()

      int i = -1;bool b = int.TryParse(null, out i);执行完毕后,b等于false,i等于0,而不是等于-1,切记. int i = -1;bool b = ...

  7. UINavigationController 导航控制器 ,根据文档写的一些东西

    今天讲了导航控制器UINavigationController 和标签栏视图控制器UITabBarController 先来说一说导航视图控制器  UINavigationController 导航控 ...

  8. springMVC之本地化和国际化

    spring框架的大部分都支持国际化,就像springMVC一样.DispatcherServlet使你能够动态的通过客户端的本地语言进行配置.这是通过LocaleResolver完成的.   当一个 ...

  9. 程序员必备英语.net版(.net菜鸟的成长之路-零基础到精通)

    通过一段时间的.NET学习,我发现英文不好是我的软肋~我觉得好好补习一下英文单词水平.可是要背哪些单词呢? 经过一段时间的整理,终于整理出来了一套比较完整的.NET程序员必备单词文档.单词加详细说明. ...

  10. EF中使用Contains方法

    第一种情况 var db=new ECEntities(); var list=new []{"8","9"}; var result=from a in db ...