Tag: multithreading

任务吞吐量不会随着多个工作容器和多个用户而增加

我们正在为每个用户运行大量的后台任务,但是增加处理这些任务的线程数量并不能使每分钟执行的任务数量达到预期的加速 – 奇怪的是,只有在多个用户涉及任务 在这种情况下,“worker”是一个Python 3.6容器,它使用threading模块运行5个线程,每个线程使用同一个Google Cloud PubSub主题 这是一个演示这个问题的例子 testing1:任务队列中的800个任务,所有任务都属于1个用户(A) testing2:2000任务在另一个任务队列中,所有任务都属于另一个用户(B) testing3:我们同时运行来自1和2的两个任务队列(在两个队列中均消耗),共计2800个任务。 我们运行testing1与1个工人容器,这需要大约30分钟 我们运行testing1与2个工人容器,这需要大约15分钟才能完成 我们用1个工作容器运行testing2,这需要大约120分钟才能完成 我们用2个工作容器运行testing2,这需要大约70分钟才能完成 我们用2个工作容器运行testing3,这需要大约200分钟才能完成 我们用4个工作容器来运行testing3,这需要200多分钟才能完成 据我所知,没有“死”的线程(死锁或其他),但有一个可能的情况下线程执行速度比预期慢得多? 当我们有4个工作容器/ 20个线程时,为什么吞吐量不会增加? 还有什么可以debugging来理解为什么吞吐量没有增加? 同样,它似乎只在同时执行多个任务队列时发生。 有关工人集装箱与之交谈的更多信息以及我们迄今为止发现的信息: 工作者容器都在通过HTTP / S进行通信: 一个由Google云SQLpipe理的数据库实例(读写)。 我们没有看到任何显着的性能下降与多达100线程同时阅读或写作 一个弹性search节点(读写)。 每个用户都有自己的索引,每个任务都附有索引。 我们观察到,多个指标同时编制时,指数performance出现亏损; 然而使用批量写入模式并没有改善这一点。 另一个后端服务完成了任务的一部分,看着这个我们并没有发现它是一个瓶颈,因为它是独立的 Google Pub-Sub用于拉取和确认任务 第三方API – 我们没有遇到任何费率限制

烧瓶,uWSGI和线程产生不可重现的结果

我有一个基于flask + uwsgi(运行在docker容器中)的API。 它的input是一个文本,它的输出是一个简单的json,带有关于这个文本的数据(类似{“score”:1})。 我在5个线程中请求这个API。 在我的uwsgi.ini中我有进程= 8和线程= 2.最近我注意到一些结果是不可重复的,虽然API的源代码没有改变,没有任何代码挑起内部的随机答案。 所以我采取了相同的一组查询,并将其提交给我的API,首先是顺序,然后是反向的。 大约1%的答复不同! 当我在本地做同样的事情(没有线程和docker&只在一个线程),结果变得一样。 所以我的假设是烧瓶有时会混淆对不同线索的反应。 有人处理过吗? 我发现只有https://github.com/getsentry/raven-python/issues/923 ,但如果是这样的话,那么问题仍然没有解决,因为我明白… 所以这里是相关的代码片断: uwsgi.ini [uwsgi] socket = :8000 processes = 8 threads = 2 master = true module = web:app 要求 import json from multiprocessing import Pool import requests def fetch_score(query): r = requests.post("http://url/api/score", data = query) score = json.loads(r.text) query["score"] = […]

docker工分配docker线程到包含的应用程序?

Docker在我的理解中是包含一个OS的应用程序。 所以,当一个应用程序产生线程或派生进程(可能产生线程)的请求,启动的线程是某种docker线程或请求直接到主机操作系统? docker是否以任何方式pipe理应用程序线程请求?

如何在Docker中设置Puma worker,Rails的线程

我最近在Docker上部署了一个Rails应用程序到Amazon ECS。 我的应用程序使用两个容器 – 一个用于应用程序,Puma作为应用程序服务器,另一个用于nginx,作为应用程序的反向代理。 我正在使用2个工人和5个线程的默认彪马configuration。 我在t2.small上运行这个实例。 我们开始看到应用程序最终会开始超时的问题。 用户不会得到任何回应,或者最终会从负载均衡器中获得504错误的网关错误。 在Rails日志中,我们会看到在没有非常特殊的情况下,请求会突然开始太长(800秒!)。 几分钟后,彪马将开始一个新的工人,它会恢复正常。 我在Puma的文档中读到,你应该设置工作人员等于CPU核心的数量,在t2.small上是1,所以我这样做了。 我也读过,如果你不确定你的应用程序是否是线程安全的,你不应该搞砸了,所以我把线程设置为1。 1名工人,1个线程。 整天都很好 – 迄今为止。 我将如何获得更多的并发性? 该应用程序几乎没有使用内存或CPU – 我应该旋转更多的任务(1任务= 1轨道容器+ 1个Nginx容器)? 如果我在Puma面前有nginx,我甚至需要担心吗?

docker统计数据中的cpu%非常高?

我正在尝试解决Docker容器的问题,以及什么似乎是与托pipe应用程序的某种有问题的交互。 我正在运行docker集装箱,我正在监视docker stats 。 我看到那个CPU%高达5000.02% 。 那是什么意思? 注:我没有任何configuration或调整到容器。 那么这是否意味着它需要所有的核心或只有一个核心或什么?

单片(VS)微服务==>线程(vs)进程

我有一个单一的进程有5个线程的单片应用程序。 每个线程完成特定的任务。 想把这个应用程序转移到使用docker的微服务。 如果我看看架构,每个工作线程将成为一个docker进程。 因此,在我看来,单核与微服务在某种程度上变得更像是Thread vs Process讨论。 拥有庞然大物的原始思想是有性能的线程和共享相同的内存。 现在使用微服务拱,我被推到一个stream程模型,可能不适合从性能的angular度来看。 我有点困扰如何解决这个问题。

Docker Java客户端API连接池

在EE平台中使用Docker-client API( https://github.com/spotify/docker-client )来pipe理远程计算机上的一组容器。 运行在Docker实例中的Java SE Client为了处理工作。 处理完成后,从客户端获得响应,即时重新启动容器,让它在一个单独的线程中等待15秒,并在时间到了之后暂停该容器。 但有一个问题,当我通过DefaultDockerClient或DockerClient在multithreading中暂停容器。 虽然即时通讯设置连接在1000上,在暂停工作时即时得到下面的exception。 我一直在debuggingPoolingHttpClientConnectionManager数小时是否设置。 是的。 它已经设置为1000.但它不适用于并行请求? 有没有人有一个想法,为什么它不工作? 由于:java.util.concurrent.ExecutionException:javax.ws.rs.ProcessingException:无法在java.util.concurrent.FutureTask.get上的java.util.concurrent.FutureTask.report(FutureTask.java:122)处调用请求(FutureTask.java:188)at com.spotify.docker.client.DefaultDockerClient.request(DefaultDockerClient.java:1019)… 9 more 引起:javax.ws.rs.ProcessingException:无法在org.jboss.resteasy.client.jaxrs.internal的org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:287)上调用请求。 .ClientInvocation.invoke(ClientInvocation.java:407)位于org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.invoke(ClientInvocation.java:442),位于org.jboss.resteasy.client.jaxrs.internal.ClientInvocation $ 2。调用(ClientInvocation.java:477)在java.util.concurrent.FutureTask.run(FutureTask.java:262)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:745) 导致:java.lang.IllegalStateException:无效的BasicClientConnManager的使用:连接仍然分配。 确保在分配另一个之前释放连接。 在org.apache.http.impl.conn.BasicClientConnectionManager.getConnection(BasicClientConnectionManager.java:160)的org.apache.http.util.Asserts.check(Asserts.java:34)位于org.apache.http.impl.conn .BasicClientConnectionManager $ 1.getConnection(BasicClientConnectionManager.java:142)at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:423)at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient。 java:863)org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)org.jboss .resteasy.client.jaxrs.engines.ApacheHttpClient4Engine.invoke(ApacheHttpClient4Engine.java:283)

java.lang.NoClassDefFoundError:多次使用程序后发生

我有一个从Docker容器运行的服务,它运行了大约一个小时左右,然后突然抛出一个java.lang.NoClassDefFoundError。 看完这些错误之后,它似乎在初始化中经常出现问题,但是我的服务一开始就运行良好 – 包括使用突然找不到的类! 事实上,这个特定的类需要被初始化,以便服务正确启动。 这是一个在Spring上运行的multithreading应用程序。 一个class上课后失踪的原因是什么?

用于消费者程序的multithreading与容器的优缺点

考虑一个RabbitMQ消费者计划。 你可以编写一个multithreading的线程,其中每个线程使用队列项目的一部分。 或者你可以用一个线程编写一个简单的CLI程序,连接到RabbitMQ代理程序,在这个代理程序中循环使用队列中的项目,然后在不同的容器中运行它们中的几个! 你认为我应该执行哪一个? 在这种情况下,multithreadingvs容器有什么优点和缺点?

docker集装箱内的多个线程

我需要在Docker容器内产生N个线程。 我将收到一个元素列表,然后将它分成块,每个线程将处理每个块。 所以我正在使用一个进程和N个线程的docker集装箱。 docker工人是不是很好的做法? 我想是的,因为我们有,例如,处理连接产生线程的apacha web服务器。 或者每个块都会产生N个容器? 如果是这样,那么做这个的正确方法是什么?