Haskell - 来自PHP的Unix域套接字瓶颈?

时间:2016-07-07 06:39:59

标签: php sockets unix haskell unix-socket

我正在编写一个微服务框架,与PHP站点一起工作。我已经在我的本地计算机(OSX)上编写并测试了它并且它运行良好。它将获取数据,将其作为ByteString读取,使用Aeson将其解析为Haskell数据,并对该数据执行特定操作。我通过Unix域套接字进行通信。

我在本地系统上测试了它,通过对{Hhostell程序进行通信的localhost php文件curl进行了测试。它能够在大约2分钟内发送/接收/打印信息10,000次。

当我把它移到生产服务器上并用PHP实现完全相同的东西时,一些奇怪的事情开始发生。 Haskell程序运行,然而它被某个地方捕获并且似乎挂起了越来越多的时间。首先它比它应该延长0.1秒,它只是持续上升。大约一分钟接收10次以上的请求/秒后,挂起时间几乎是8秒。通过将Haskell通过套接字调用的时间与当前时间(数据库调用之前)进行比较,我确保数据库因任何原因而变慢。

这是我的主要功能:

import Network.Socket

main :: IO ()
main = do
    removeSocketFile socketName
    resource <- defaultResources
    withSocketsDo $ do
        sock <- socket AF_UNIX Stream 0
        bind sock $ SockAddrUnix socketName
        chmodSocket socketName
        putStrLn $ "Created socket file at " ++ socketName
        listen sock maxListenQueue
        catch
            (handleSocket sock resource)
            (\e -> do
                putStrLn $ show (e :: AsyncException)
                close sock
                putStrLn "Closed socket"
                removeSocketFile socketName
            )

这是处理套接字和所有内容的代码:

import Network.Socket
import Network.Socket.ByteString as NB
import Data.ByteString as B
import Data.Char as C

handleSocket :: Socket -> ServerResources -> IO ()
handleSocket sock resource = do
    (conn,_) <- accept sock
    forkIO $ processConn conn resource
    handleSocket sock resource

processConn :: Socket -> ServerResources -> IO ()
processConn conn resource = do
    msg <- NB.recv conn 2048
    unless (B.null msg) $ do
        let (cmd, payload) = B.break (== (fromIntegral $ C.ord ':')) msg
        delegate cmd (B.drop 1 payload) conn resource
        return ()

有没有人在这里看到任何错误会导致程序行为如上所述?奇怪的是,当我在OSX上运行它时,它根本没有破坏,但是当我把它放到Ubuntu 15.10上时,事情并没有按照他们应该的方式进行。

我认为它可以被隔离到这些函数中,因为除了数据库之外,它们是处理任何类型IO的唯一函数(我已经得出结论不是问题)。

感谢任何帮助。感谢。

0 个答案:

没有答案