Я использую локальный сервер Stanford CoreNLP и пытаюсь смоделировать нагрузку, создавая одновременные запросы POST. Я заметил, что время обработки увеличивается линейно с количеством «пользователей», которые отправляют запросы на сервер. Для параметра threads
установлено значение 8. Я что-то упустил? Я чувствую, что переход от 1 пользователя / процесса к 2 не должен иметь такого влияния ...
Stanford CoreNLP с этой командой:
nohup java -mx10g -Dorg.slf4j.simpleLogger.defaultLogLevel=error -cp "${USER_HOME}/stanford-corenlp/*" edu.stanford.nlp.pipeline.StanfordCoreNLPServer -threads 8 -serverProperties "${USER_HOME}/NLP/dependencyparser/dependencyparser/tools.properties" -port 9000 -timeout 300000 -preload > ${USER_HOME}/log/StanfordCoreNLPServer.log 2>&1 & disown
Для симуляции одновременного запросы Я использую multiprocessing
в python для асинхронной отправки запросов. Каждый процесс будет отправлять один и тот же запрос 5 раз.
import requests
import pandas as pd
import numpy as np
import multiprocessing
import time
def send_stanford_request(batch_id):
all_data = ['This is sample Sentence 1. \nThis is sample Sentence 2. \nThis is sample Sentence 3']
num_requests=5
t0 = time.time()
for ii in range(num_requests):
rr = requests.post('http://[::]:9000/?properties={"outputFormat":"text"}', all_data)
t1 = time.time()
time_batch = t1 - t0
out_res = {'batch_id':batch_id,'total_batch_time':time_batch,
'batch_time_per_req':time_batch/num_requests}
return out_res
Здесь я создаю несколько процессов, которые отправляют запросы одновременно:
def multi_requests(nprocs):
tt0 = time.time()
process = multiprocessing.Pool(processes=nprocs)
out_data = process.map(send_stanford_request,list(range(1,nprocs+1)))
process.close()
tt1 = time.time()
full_run_time = tt1-tt0
print ("Processing complete with {} processes".format(nprocs))
print ("Total time: {}".format((tt1-tt0)))
return out_data,full_run_time
Основная программа:
if __name__=="__main__":
total_time_list = []
for nreq in range(1,11,1):
out_nreq,full_run_time = multi_requests(nreq)
total_time_list.append(full_run_time)
print(total_time_list)
Вывод:
[25.180917024612427, 50.08782601356506, 75.14966297149658,
100.1421709060669, 125.16093802452087, 150.2395520210266,
175.24192595481873, 200.2490758895874, 225.28618001937866,
250.2914171218872]
Файл проповеди:
annotators = tokenize,ssplit,pos,lemma,ner,parse,mention,dcoref
depparse.extradependencies = MAXIMAL
depparse.model = edu/stanford/nlp/models/parser/nndep/english_SD.gz
outputExtension = .out
parse.model = edu/stanford/nlp/models/lexparser/englishPCFG.ser.gz
ssplit.eolonly = true
ssplit.newlineIsSentenceBreak = always