Articles of multithreading

什么时候servlet释放它的线程?

假设没有保留,当一个servlet容器作为一个独立的服务器时,我认为servlet的线程不会被释放,直到整个响应被发送到客户端(比如web浏览器)。 这是一个正确的假设吗? 但是,如果servlet支持像Nginx这样的反向代理,会发生什么? 一旦将响应传递给Nginx,线程是否被释放,或者直到响应被发送到它的最终客户端(比如浏览器)? 更新:让我试试这个更清楚一点。 对于从servlet发送到像nginx这样的代理的响应,仅需要几毫秒(比如2ms)。 但是,它可能需要额外的80ms(或者这样)才能从nginx发送给浏览器。 一旦响应发送给nginx,servlet是否释放线程/stream,或者servlet是否保留它们直到响应被发送到浏览器(即整个80ms)

运行的uwsgi线程太多

早上好, 我是networking服务器基础架构和pipe理的新手。 我尝试使用nginx + uwsgi + django和python装载Web服务器时遇到以下问题:每次刷新或请求到用户正在执行的网页时,uwsgi都会创build2-3个永不终止的新线程。 几天之后,我终于有超过30000个线程,为了保持网页的性能,我必须重新加载uwsgi。 要检查线程数,我使用以下命令: ps – eLf | grep uwsgi (你可以看到附加的结果)。 我的uwsgiconfiguration如下: [uwsgi] vhost = true socket = /tmp/mySocket.sock master = true processes = 4 max_request = 300 vacuum = true die-on-term = true close-on-exec = true harakiri = 30 wsgi-file = /home/virtualEnv/server/wsgi.py virtualenv = /home/virtualEnv pythonpath = /home/virtualEnv/myServer chdir=/home/virtualEnv/myServer […]

uWSGI:我遇到了线程模式的问题

如果我没有线程模式使用uWSGI,它工作正常。 但是我的原始服务器运行Apache ServerLimit 1,线程模式。 它可以处理并发连接,但我的uWSGI不能(因为工人只有1,我认为)。 所以我尝试打开线程模式,但是我会从nginx获得502 Bad Gateway错误消息。 我的日志显示了我:uwsgi:Modules / gcmodule.c:277:visit_decref:声明`gc-> gc.gc_refs!= 0'失败。 我不知道什么是错的,我怎样才能使它工作? 谢谢。 这是我的configuration: [uwsgi] show-config=True socket=:8002 pidfile=/var/run/unicorn_uwsgi.pid daemonize=/root/logs/unicorn_uwsgi.log vacuum=True enable-threads=True threads=40 processes=1 env=QTDIR=/root/lib/qt env=LD_LIBRARY_PATH=/root/lib/qt/lib env=DISPLAY=:99 env=XAUTHORITY=/root/webapps/xvfb/Xauthority.xvfb module=WSGI home=/root/webapps/unicorn pythonpath=/root/Source/Server/Unicorn chdir=/root/Source/Server/Unicorn 我使用nginx作为HTTP服务器,这里是configuration: server { listen 80; server_name _; location / { include uwsgi_params; uwsgi_pass 127.0.0.1:8002; } } 操作系统:CentOS 6.0,CPU:AMD Athlon(TM)XP 2500+,RAM:2G Python 2.6.5(默认),uWSGI:0.9.8.2,nginx:0.8.54

Nginx + fastcgimultithreading

你好,我一直在试图做fastcgi应用程序,我希望它是multithreading的,所以它可以处理大量的请求在同一时间。 我find了代码,并修改了一下 FCGX_InitRequest(&request, 0, FCGI_FAIL_ACCEPT_ON_INTR); for (;;) { static pthread_mutex_t accept_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t counts_mutex = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_lock(&accept_mutex); rc = FCGX_Accept_r(&request); pthread_mutex_unlock(&accept_mutex); … … … FCGX_FPrintF(request.out,"%s",test_stream.str().c_str()); FCGX_Finish_r(&request); } 代码一直在接受,所以实际上等待,直到请求完成。 我试过像这样产卵fastcgi spawn-fcgi -p 8001 -U www-data -n handler.cgi -F 32 spawn-fcgi -p 8001 -U www-data -n handler.cgi — /usr/bin/multiwatch -F 32

php-fpm如何使用dynamicstream程pipe理器pipe理员工?

我想澄清一下php-fpm如何用dynamic进程pipe理器pipe理工作人员。 我们假设我们有以下configuration: pm = dynamic pm.max_children = 100 pm.start_servers = 30 pm.min_spare_servers = 20 pm.max_spare_servers = 60 当php-fpm启动时,它产生了30个进程 没有联系。 根据min_spare_servers的设置,php-fpm会closures10个工人吗? 如果是,在什么时候发生? 有40个连接到nginx。 请问php-fpm将每个连接与单独的工作人员,并立即派出额外的工人,以满足其余的连接? 有80个连接到nginx。 如果php-fpm启动了60名工作人员,它将如何工作? 和(3)一样? 有120个连接到nginx。 将100名工人分配到100个连接后会发生什么? php-fpm是否使用连接队列? 会限制nginx吗? 请问php-fpm开始删除连接消息“ 服务器达到pm.max_children设置 ”? 有50个连接到nginx。 Nginx会从100个连接恢复到60个连接吗? 还是50? 它会立即杀死40名工人还是会等一段时间? 如你所见,这是一个关于php-fpm如何pipe理进程的普遍问题。 更具体地说,我想了解php-fpm中pm.max_children和pm.max_spare_servers之间的区别。

用于Django应用程序的uWSGI + nginx避免了pylibmcmultithreading并发问题?

介绍 我本周遇到这个非常有趣的问题,最好从一些事实开始: pylibmc 不是线程安全的 ,当用作django memcached后端时,直接在shell中启动多个django实例会在碰到并发请求时崩溃。 如果用nginx + uWSGI部署,这个问题与pylibmc神奇地分开。 如果您将djangocaching后端切换到python-memcached ,它也将解决这个问题,但这个问题不是这个问题。 精 从第一个事实开始,这是我如何复制pylibmc问题: pylibmc的失败 我有一个django应用程序,它执行大量的memcached读写操作,并且有这个部署策略,我在shell中启动多个django进程,绑定到不同的端口(8001,8002),并使用nginx来实现平衡。 我发起了两个独立的负载testing,使用locust这两个django实例,这是发生了什么事情: 在上面的屏幕截图中,他们都崩溃了,并报告完全相同的问题,如下所示: 断言“ptr-> query_id == query_id +1”对于函数“memcached_get_by_key”可能是“程序员错误,query_id没有增加”,在libmemcached / get.cc中:107 uWSGI去救援 所以在上面的例子中,我们了解到通过pylibmc对memcached进行multithreading并发请求可能会引起问题,这不知怎么uWSGI , uWSGI和多个worker进程有关。 为了certificate这一点,我启动了包含以下设置的uWSGI : master = true processes = 2 这告诉uWSGI启动两个工作进程,然后告诉nginx服务器的任何django静态文件,并将非静态请求路由到uWSGI ,看看会发生什么。 在服务器启动的时候,我对localhost中的django启动了相同的蝗虫testing,并且确保每秒有足够的请求来引起对memcached的并发请求,结果如下: 在uWSGI控制台中,没有死亡工作进程的迹象,也没有工作人员重新生成,但是在屏幕截图的上半部分,肯定有并发请求(5.6请求/秒)。 这个问题 我非常好奇uWSGI如何让这个消失,我不知道他们的文档,回顾一下,问题是: uWSGI如何pipe理工作进程,以便multithreadingmemcached请求不会导致django崩溃? 实际上,我甚至不确定uWSGIpipe理避免这个问题的工作进程的,或者uWSGI自带的其他一些魔术技术,我在文档中看到了一些叫做memcached路由器的东西,很明白,这是否涉及?

重复使用tomcat线程,等待“长”的时间

configuration Web服务器:Nginx 应用程序服务器:具有200个请求服务线程的默认configuration的Tomcat 预期的响应时间为我的服务器:<30秒(有很多第三方依赖项) 情景 每10秒钟,应用程序将需要生成令牌供其使用。 令牌生成的预期时间大约是5秒,但是由于它的第三方系统是通过networking联系的,这显然是不一致的,可能会下降到10秒。 在令牌生成过程中,每秒接近80%的传入请求需要等待。 我相信会发生什么 由于等待令牌生成的请求将不得不等待“长”时间,因此在等待令牌生成过程完成的同时,没有理由将这些请求服务重新用于服务其他传入请求。 基本上,如果我的20%继续服务,这是有道理的。 如果等待的线程没有被其他请求使用,tomcat请求服务的限制将被达成,服务器将基本上窒息,这是我不是很兴奋的事情发生。 我试过了什么 最初我希望切换到Tomcat的NIO连接器将完成这项工作。 但看了这个比较后,我真的没有希望了。 不过,我试着强迫这些请求等待10秒钟,但是没有奏效。 现在我正在思考的是,我需要在请求的时候搁置这个请求,并且需要通知tomcat这个线程可以被重用。 同样,当需要向前移动的时候,我需要tomcat给它一个线程池的线程。 但我怎么做,或者即使这是可能的,我也是盲目的。 任何指导或帮助?

开始在Linux上使用Java进行实时事件调度?

我正在开发一个项目,该项目将使用Java在Linux系统上logging实时事件的数据。 我把所有的HTML抓取的东西都放下了,这很好,我需要弄清楚的是任务的调度和pipe理。 每周可能会有多达四十个事件发生,时间不一,事件可能持续三个小时。 我可以随意创build和更新这些事件的日历,我的问题是如何: 安排一个stream程,在正确的时间刮取每个事件,并在有变更时更新计划。 确保一旦刮开过程已经开始,它在事件的整个(不确定的)持续时间内保持运行。 任何人都可以build议如何最好地处理这个? 我不知道我需要从哪里开始。 谢谢!

如何在一个线程上花费比互斥体更长的时间?

我试图测量一个线程唤醒睡眠线程时的延迟。 由于据说许多同步前体是在futex之上开发的,我期望futex总是更快。 但是,我的testing结果是相反的。 我想知道我做错了什么,或者它实际上是一个事实。 这是我testing的细节: 进程已经被设置为一个特定的核心 时间由RDTSC()指令返回的数字进行比较 创build2个线程,其中醒来的线程2具有较高的FIFO优先级 线程1通过解锁互斥体来发送信号,所以线程2应该在下一个时间表中唤醒。 thread1上的sleep(1)是为了确保在调用mutex_unlock的时候thread2正在等待互斥量。 void *Thread1(void *dummy) { while(1) { pthread_mutex_lock( &mutx ); sleep(1); t1 = rdtsc(); pthread_mutex_unlock( &mutx ); pthread_yield(); } return NULL; } void *Thread2(void *dummy) { while(1) { pthread_mutex_lock( &mutx ); t2 = rdtsc(); if(t1>0) { // print out the result cout << t2-t1 << endl; […]

顶部命令显示线程 – 这是一种延迟?

我们有一个Java应用程序,一直显示100%的CPU使用率。 当我用top命令注意到一些奇怪的结果时,我试图找出是否有一些主导的线程。 如果我运行top ,它显示了一个 Java进程有100%的CPU时间。 然后我inputH来显示线程,它开始显示几个 Java线程,每个线程都有100%。 但是,下一次刷新时,它显示了不同批次的几个Java线程,每个线程都有100%的CPU。 下一次刷新,另一批。 这种情况持续了几个刷新周期,通过100%CPU的100个线程。 最后,它用十几个Java线程解决了每个CPU线程约10%的CPU时间。 这个“最终”的线程集合是一开始就显示100%CPU时间的线程,但现在它们每个都只有10%。 如果直接运行top -H直接进入最终设置。 我的直觉是Java线程的100%的CPU有些虚假。 但是我找不到解释。 我在Debian Wheezy框中。