Застревание с помощью STM - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть следующее Скотти приложение, которое пытается использовать 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>"]

Я "загружаю тест" API следующим образом:

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

Однако API обслуживает около 16 тысяч запросов, а затем «зависает» - ab останавливается с ошибкой apr_socket_recv: Operation timed out (60).

Я думаю, что неправильно использую STM, но неуверен, что я делаю не так.Есть предложения?

1 Ответ

5 голосов
/ 09 апреля 2019

Быстрое предположение здесь. 16 000 - это количество доступных портов TCP. Возможно ли, что вы не закрыли какие-либо соединения и поэтому исчерпали открытые порты для ab?

...