使用 STM 获取 "stuck"

Getting "stuck" using STM

我有以下 Scotty 应用程序,它尝试使用 STM 来记录服务的 API 呼叫数:

{-# LANGUAGE OverloadedStrings #-}

module Main where

import Web.Scotty
import Data.Monoid (mconcat)
import Control.Concurrent.STM
import Control.Monad.IO.Class

main :: IO ()
main = do
  counter <- newTVarIO 0
  scotty 3000 $
    get "/:word" $ do
      liftIO $ atomically $ do
        counter' <- readTVar counter
        writeTVar counter (counter' + 1)
      liftIO $ do
        counter' <- atomically (readTVar counter)
        print counter'
      beam <- param "word"
      html $ mconcat ["<h1>Scotty, ", beam, " me up!</h1>"]

我"load test" API 是这样的:

ab -c 100 -n 100000 http://127.0.0.1:3000/z

然而,API 服务大约 16000 个请求,然后得到 "stuck" - ab 停止并出现错误 apr_socket_recv: Operation timed out (60)

我认为我在滥用 STM,但不确定我做错了什么。有什么建议吗?

在这里快速猜测。 16,000 大约是可用的 TCP 端口数。有没有可能你没有关闭任何连接,因此 运行 没有 ab 的开放端口?