Web API的CPU占用100%

我用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的序列化测试。

源码:


 1 using System;
2 using System.Collections.Generic;
3 using System.Diagnostics;
4 using System.IO;
5 using System.Linq;
6 using System.Runtime.Serialization.Json;
7 using System.Text;
8 using Newtonsoft.Json;
9 using Formatting = System.Xml.Formatting;
10
11 namespace TestSerializationConsole
12 {
13 class Program
14 {
15 static void Main(string[] args)
16 {
17 Stopwatch timer = new Stopwatch();
18 timer.Start();
19 List<ApiResult> list = new List<ApiResult>();
20 for (int i = 0; i < 1000000; i++)
21 {
22 ApiResult result = new ApiResult
23 {
24 Code = i,
25 ErrorMsg = string.Format("当前编号:{0}", i),
26 IsError = (i % 2 == 0),
27 Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
28 Guid = Guid.NewGuid().ToString()
29 };
30 list.Add(result);
31 }
32 timer.Stop();
33 Console.WriteLine("共创建{0}项\t共耗时:{1}毫秒", list.Count, timer.ElapsedMilliseconds);
34 timer.Restart();
35 int count1 = list.Select(apiResult => Serialize1(apiResult)).Count(jsonResult => jsonResult.Length > 60);
36 timer.Stop();
37 Console.WriteLine("System.Runtime.Serialization.Json序列化{0}项\t共耗时:{1}毫秒", count1, timer.ElapsedMilliseconds);
38 timer.Restart();
39 int count2 = list.Select(apiResult => Serialize2(apiResult)).Count(jsonResult => jsonResult.Length > 60);
40 timer.Stop();
41 Console.WriteLine("Newtonsoft.Json.dll序列化{0}项\t共耗时:{1}毫秒", count2, timer.ElapsedMilliseconds);
42 Console.ReadKey();
43 }
44
45 private static string Serialize1(ApiResult obj)
46 {
47 string jsonContent = string.Empty;
48 DataContractJsonSerializer serialize = new DataContractJsonSerializer(typeof(ApiResult));
49 using (MemoryStream ms = new MemoryStream())
50 {
51 serialize.WriteObject(ms, obj);
52 jsonContent = Encoding.UTF8.GetString(ms.ToArray());
53 }
54 return jsonContent;
55 }
56
57 private static string Serialize2(ApiResult obj)
58 {
59 string jsonContent = string.Empty;
60 jsonContent = JsonConvert.SerializeObject(obj);
61 return jsonContent;
62 }
63 }
64
65 public class ApiResult
66 {
67 public int Code { get; set; }
68 public string ErrorMsg { get; set; }
69 public bool IsError { get; set; }
70 public string Time { get; set; }
71 public string Guid { get; set; }
72 }
73 }

测试结果:

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

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

继续测试:

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

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

Web API的CPU占用100%,布布扣,bubuko.com

时间: 2024-12-18 22:58:26

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

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

对于IIS 管理员来说,经常会碰到 Web 服务器 CPU 占用 100% 的情况,以下是个人的日常工作总结和一些解决办法,主要用来剖析 w3wp.exe(IIS )  占用 CPU 100% 的一些原因 和解决方案,希望能对你有所帮助 w3wp.exe的解释 : 全名,IIS Application Pool Process. w3wp.exe是IIS工具的一部.w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe

sql数据库cpu占用100问题查询

转载    原作者  xunziji SQL Server Cpu 100% 的情况并不太常见,一般引起 SQL Server 产生性能问题的,都是 阻塞.连接数.IO 磁盘等.所以,一般SQL Server 的使用率都是比较低的.但是,在有些情况下,还是会出现Cpu 100%的情况的. SQL Server 在做哪些操作的时候,会比较集中使用 CPU 资源呢?常见的主要如下: 常见的原因: 1. 编译和重编译 编译是 SQL Server 为指令生成执行计划的过程.SQL Server 要分析

macos mail CPU占用100% 且内存不断增加的问题

macos mail CPU占用100% 且内存不断增加的问题 我的问题最终的解决方法似乎是把mail程序的日志清除一下就好了. 通过<活动监视器>查看到mail打开的文件中,有日志的目录: 进去查看发现有一个日志文件居然达到1.77GB,还有几个是几百MB的,删除所有日志文件. 之后重启mail后,发现mail运行就正常了.

Java项目服务器cpu占用100%解决办法

服务器cpu占用100% 项目上线后运行一段时间,突然发现cpu 8个逻辑核心都占用100%,心情很紧张,然后就在网上找了一些解决方法,具体如下:        1.查找哪些进程在耗cpu         进入服务器,top 命令看一下,发现进程6633占用了800%        [[email protected] ~]# top        2.把进程的栈dump到文件里,以便后面的分析       [[email protected] ~]# jstack 23812 >> java

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

下面是一些经验 供参考 解决MySQL CPU占用100%的经验总结 - karl_han的专栏 - CSDN博客 https://blog.csdn.net/karl_han/article/details/5630782 MySQL服务器 IO 100%的分析与优化方案 - hello_katty的专栏 - CSDN博客https://blog.csdn.net/hello_katty/article/details/83268370 MySQL服务器CPU跑满100%的情况分析 - qq_

解决YED画图CPU占用100%的问题

背景 公司很多项目都会用到YED包来画关联方的关联图,当某个公司的4度关联方个数过多以及关联关系太过复杂时,使用YED画图会造成CPU占用一直100%并且长时间占用不释放CPU资源.所以在使用YED画图的代码流程设计需要一些技巧来保证YED画图不会阻塞主线程,并且确保当图片长时间无法绘制成功时,需要有一种机制强制终止绘制,避免CPU资源长时间无意义的浪费. 解决方案思考 找出YED无法完成绘制的原因.从根本上解决. 如果无法从根本上解决至少需要解决长时间CPU100%占用. 尝试解决 首先尝试了

Linux jstack分析cpu占用100%

背景: 运行测试程序后,top命令发现某个进程(pid)占用cpu达到100%. 查看哪个线程占用最多资源: ps mp pid -o THREAD,tid,命令查看这个进程下面的所有线程占用情况. 发现线程324占用最多. 使用jstack进行跟踪: jstack pid 进行查看输出到临时文件 jstack 324> test 将刚刚发现占用cpu最多的线程id(324)换算成16进制,324==>144 查看jstack 生成的文件: 下面可以看出是哪行代码导致,查看那行代码发现有死循环

linux下模拟CPU占用100%小程序

在做一个测试时,需要模拟服务器CPU占用满的情况,在查阅相关资料后,发现网上程序不太好用, 原文在这:http://www.2cto.com/os/201304/202068.html 优化后如下: #! /bin/sh # filename killcpu.sh if [ $# -ne 1 ] ; then echo "USAGE: $0 <CPUs>|stop" exit 1; fi stop() { while read LINE do kill -9 $LINE e

win10磁盘/cpu占用100%问题

https://www.zhihu.com/question/27664545 https://www.zhihu.com/question/27664545 微软自己的解决办法 https://support.microsoft.com/en-us/help/3083595/task-manager-might-show-100-disk-utilization-on-windows-10-devices-wit https://support.microsoft.com/zh-cn/help