- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我有一个玩具网络应用程序,它非常占用 CPU
func PerfServiceHandler(w http.ResponseWriter, req *http.Request)
{
start := time.Now()
w.Header().Set("Content-Type", "application/json")
x := 0
for i := 0; i < 200000000; i++ {
x = x + 1
x = x - 1
}
elapsed := time.Since(start)
w.Write([]byte(fmt.Sprintf("Time Elapsed %s", elapsed)))
}
func main()
{
http.HandleFunc("/perf", PerfServiceHandler)
http.ListenAndServe(":3000", nil)
}
上述函数执行大约需要 120 毫秒。但是当我用 500 个并发用户(siege -t30s -i -v -c500 http://localhost:3000/perf)对这个应用程序进行负载测试时,我得到的结果是
有人可以回答我下面的问题吗:-
环境:-
Go - go1.4.1 linux/amd64
OS - Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
Processor - 2.6Ghz (Intel(R) Xeon(R) CPU E5-2640 v3 @ 2.60GHz)
RAM - 64 GB
操作系统参数-
nproc - 32
cat /proc/sys/kernel/threads-max - 1031126
ulimit -u - 515563
ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 515563
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 65536
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 515563
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
最佳答案
多个goroutine可以对应一个os线程。此处描述了设计:https://docs.google.com/document/d/1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw/edit ,引用本文:http://supertech.csail.mit.edu/papers/steal.pdf .
关于问题:
Even when 500 concurrent requests arrive at the server the number of OS threads were still stuck at 35 OS threads [...] Can someone explain me this behaviour?
由于您将 GOMAXPROCS 设置为 CPU 的数量,因此 go 一次只会运行那么多 goroutine。
可能有点令人困惑的一件事是 goroutines 并不总是运行(有时它们“很忙”)。例如,如果您读取一个文件,当操作系统正在执行该工作时,goroutine 很忙,调度程序将选择另一个 goroutine 来运行(假设有一个)。一旦文件读取完成,goroutine 就会回到“可运行”goroutines 列表中。
操作系统级线程的创建由调度程序处理,并且系统级调用具有额外的复杂性。 (有时您需要一个真正的专用线程。请参阅:LockOSThread)但您不应期望有大量线程。
Can the no. of OS threads be increased somehow (from OS or from GOlang)?
我认为使用 LockOSThread
可能会导致创建新线程,但这无关紧要:
Will this improve the performance if no. of OS threads are increased?
没有。您的 CPU 从根本上限制了它一次可以做多少事情。 Goroutines 之所以有效,是因为事实证明大多数操作在某种程度上都是 IO 绑定(bind)的,但如果你真的在做一些 CPU 绑定(bind)的事情,那么在这个问题上投入更多的线程将无济于事。事实上,这可能会使情况变得更糟,因为在线程之间切换会产生开销。
换句话说,Go 在这里做出了正确的决定。
Can someone suggest some other ways of optimizing this app?
for i := 0; i < 200000000; i++ {
x = x + 1
x = x - 1
}
我想你写这段代码只是为了让 CPU 做很多工作?实际代码是什么样的?
您最好的选择是找到一种方法来优化该代码,从而减少它需要的 CPU 时间。如果那不可能(它已经高度优化),那么您将需要添加更多计算机/CPU。获得更好的计算机,或更多。
对于多台计算机,您可以在所有计算机前面放置一个负载均衡器,这应该很容易扩展。
您还可以通过将这项工作从网络服务器中分离出来并将其移动到某个后端系统而受益。考虑使用工作队列。
关于go - 优化 CPU 密集型 Golang WebApp 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062703/
我有一个在 Tomcat 7.0.54 上运行的 Java webapp。我在 webapp 中使用 Spring。当用户登录到/favicon.ico 时。当用户第二次登录时,他们将被重定向到正确的
如何使用通用的 webappclassloader 为 tomcat 中的所有 webapps 自定义 webapp 类加载器? 我看到我可以扩展类加载器并将其添加到每个 web 应用程序的上下文标记
我有一个 jquery mobile 和 php webapp,可以在 iOS7 中正常工作。我最近升级到 iOS8 进行一些测试,但我遇到了状态栏现在与 Web 应用程序标题重叠的问题。这似乎也导致
我注意到这些文件夹具有非常不同的属性。我最近在 webapps 文件夹下部署了一个 .war 文件。我注意到,一旦部署了 .war 文件,项目的未压缩版本就会添加到目录中。当我尝试修改未压缩版本中的任
假设您在本地主机的 Tomcat 上部署了一个名为 MyWebApp 的网络应用程序。如果您像这样使用浏览器访问它: localhost:8080/MyWebApp 那为什么会显示index.html
我正在寻找一种提示/解决方案来生成一个具有自定义设计的模板 Web 应用程序,然后我所有其他 Web 应用程序都应该采用模板 Web 应用程序的设计。那可能吗?背后的想法是,我们有多个用于项目的 We
我有一扇 Azure 前门。主要区域有一个 azure 功能,辅助区域有一个功能应用程序。当这两个功能都启动时,它工作正常。它正在向每个区域分配 50-50 个负载。但是当我故意停止主要功能时。所有流
这个问题已经有答案了: Getting Python error "from: can't read /var/mail/Bio" (7 个回答) 已关闭去年。 几天前我开始使用 python nfl
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个在 Apache Tomcat 5.5 中完美运行的 Web 应用程序,我需要“转换它”以便它可以部署在 Oracle 应用服务器 10.1.3 中。 现在我制作了一个应用程序的 WAR 文件
我在 jsp 中有 2 个 webapps,其中一个供公共(public)使用,另一个供本地使用。 是否可以在 Apache tomcat 中的一个端口上托管一个 Web 应用程序而在另一个端口上托管
最近,我一直在对模块化JS进行大量试验,但我仍然想知道是否以“正确的方式”编写它。 例如,如果我有一个页面,其中包含输入和提交按钮,这些页面应在提交后显示数据(例如表格和图形),所以我在IFFE下编写
我有一个部署为 web 应用程序的 google 脚本。此 webapp 需要发送带有 webapp 的 URL 的电子邮件,以便收件人可以使用 URL 访问 webapp。如何获取 webapp 中
我们正在部署在.Net core中开发的微服务,并将部署在Azure WebApp中 这些 WebApp 之间将进行大量通信。 现在,由于 WebApp 面向互联网,它们之间的所有调用都将通过互联网,
这个问题已经有答案了: SEVERE: Failed to initialize Jenkins [closed] (1 个回答) 去年关闭。 我在 Ubuntu 12.04 中安装了 Jenkins
我看到一个奇怪的问题。我有两个网络应用程序。一个用于我们使用 Jersey 公开的其余 Web 服务。另一个具有 JSF 前端实现,它调用上面的 web 服务来获取详细信息。我们使用 Tomcat 作
这是我在探索工作场所中某些任务自动化的世界时遇到的一个普遍问题。 我们的企业网站上有一个门户/启动板环境,其中的应用程序显示为图 block 。 其中一个应用程序打开后有一个主页,其中有一堆搜索字段和
我有两个 Google 电子表格,每个电子表格都附加了一些 Apps 脚本。最终,我想将两者部署为 Web 应用程序,以便它们可以通过其公共(public) URL 相互通信。目前,我只部署了其中一个
当我尝试运行 ngserve 时,我得到以下信息 ERROR in ./src/main/webapp/manifest.webapp Module parse failed: /home/ferga
这个问题在这里已经有了答案: Eclipse Output Folders (6 个答案) 关闭 5 年前。 我正在使用 Tomcat 5,当我启动服务器并从 webapp 文件夹加载我的应用程序时
我是一名优秀的程序员,十分优秀!