2015-04-02 65 views
0

我有一个play(2.3.0)应用程序,它执行一些数据库查找。当有超过6个用户时,应用程序会遇到性能问题。游戏应用程序中的性能问题

我已经将这个问题缩小到一个控制器,其操作是4秒钟的睡眠。 测试客户端每500毫秒调用一次该操作。我可以看到前6个请求处理完毕,并停止几秒钟(直到睡眠4秒)并读取下一个6.

另外:当我打开7个浏览器窗口时,第7个将不会加载(等待连接)。

看着documentation它看起来像我的问题是阻止io和使用高度同步的配置文件应该解决我的问题。 因此我将此配置文件添加到了我的application.conf中,但没有任何更改。

我application.conf看起来像这样

application.context=/appname/ 


# Secret key 
# ~~~~~ 
# The secret key is used to secure cryptographics functions. 
# If you deploy your application to several instances be sure to use the same key! 
application.secret="xxxxx" 


play { 
    akka { 
    akka.loggers = ["akka.event.slf4j.Slf4jLogger"] 
    loglevel = WARNING 
    actor { 
     default-dispatcher = { 
     fork-join-executor { 
      parallelism-min = 300 
      parallelism-max = 300 
     } 
     } 
    } 
    } 
} 

和行动

def performancetestSleep() = Action{ request => { 
    Thread.sleep(4000) 
    Ok("hmmm good sleep") 
    }} 

在我看来,线程池的配置被忽略。我在这里错过了什么?

+0

Thread.sleep是一个线程阻塞操作,所以它不是很好。可能你有一个可以并行处理6个线程的cpu,你知道你的cpu有核心的数量和线程吗? – David 2015-04-06 03:34:15

回答

0

你所需要的只是一个处理4秒延迟的线程 - 一个调度器。产生了许多线程击败了Play的体系结构的整个点,恕我直言。然后,您可以使用调度程序创建一个Future[Result],您可以将其提供给Action.async块。

现在,你并不需要实现自己的调度器,因为Play取决于Akka的并发性; Akka有一个调度员可以完成这项工作。

import scala.concurrent.{Promise} 
import scala.concurrent.duration._ 
import play.libs.Akka 

val system = Akka.system() 

def delayedResponse = Action.async { 
    import system.dispatcher 

    val promise = Promise[Result] 

    system.scheduler.scheduleOnce(4000 milliseconds) { 
    promise.success(Ok("Sorry for the wait!")) 
    } 

    promise.future 
} 
+0

我使用了描述的解决方案,因为文档提到在阻塞环境中使用它,并且我还读到在阻塞调用中使用异步不能解决问题。也许我读错了,反正我会试试这个,tnx。 – user3056794 2015-04-17 06:17:42

+0

我发布的解决方案完全异步。你不需要增加你的线程池大小。我的印象是,您想解决服务器无法处理超过6个请求的问题。这至少可以解决这个问题。 – 2015-04-18 19:16:21

0

我用

激活运行

启动服务器,似乎没有拿起线程池配置文件。使用

激活启动

确实,现在的轮廓似乎使用。我现在需要测试这是否解决了我的问题。还会看看异步调用。