开启了10个进程的异步任务,查看状态好多都是 N/A N/A N/A N/A N/A [busy]
load average: 0.06, 0.14, 0.08 event-loop:\Workerman\Events\Select
2 workers 11 processes
worker_name exit_status exit_count
TaskWorker 0 0
none 0 0
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
20840 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20841 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20842 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20843 5.73M text://127.0.0.1:8089 TaskWorker 1 0 0 8 0 [idle]
20844 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20845 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20846 5.73M text://127.0.0.1:8089 TaskWorker 1 0 0 8 0 [idle]
20847 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20848 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20849 N/A text://127.0.0.1:8089 TaskWorker N/A N/A N/A N/A N/A [busy]
20850 4.81M http://127.0.0.1:8088 none 22 0 0 167 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 14M - - 24 0 0 183 0 [Summary]
需要同时处理多个慢业务,用命令行按顺序一个个执行,需要4个小时左右,想要减少到2个小时内,1个小时更好
服务器需要什么配置
需要做哪些优化
怎么查看业务并发连接数超过1000同时在线,我的服务器没有优化内核
需要怎么设置才不会出现很多N/A 和 busy
问答去搜索和看文档
进程在处理慢业务,显示busy是正常的
不想出现太多的busy要怎么设置
优化业务,让业务处理更快些
是第三方的,没法优化
在异步任务里面再创建一个异步任务就可以了····
这样不行的吧
多开进程
异步任务开了20个进程
你的异步任务是在你的业务流程中干嘛用的,类似定时任务,或者队列这种性质还是
同步第三方数据
那就无所谓啊,不怕阻塞的场景
是不怕堵,但是时间长啊,想把4小时降到2小时内
一个任务能执行4小时,那你要优化这个任务,和框架无关系喔。要优化的是你的业务流程,碎片化,分片等操作
比如一次任务是100W数据,你可以分片成每个进程1W条数数据,然后不同的进程执行不同的批次号这样?
比如一次任务是100W数据,你可以分片成每个进程1W条数数据,然后不同的进程执行不同的批次号这样?
是的,同时执行
这就可以减少时间了
或者是做增量同步,只把要同步的,丢到队列,让进程自己去竞争消费同步
这样也是自动分片咯
队列是排队执行的
只是按顺序出列,但是实际执行还是看进程的,多进程竞争这个,几乎是做到了自动分片和异步了。当然这是指增量同步的方案
执行完后,记录id,id还是和进入队列的顺序一下的,如果是多进程竞争,记录的id应该是乱序的才对
正常是按id顺序出列和入库,如果某个消费进程有阻塞,这个id不会按顺序入库了。不过这样对你业务有什么影响吗,现在只是要解决你慢的情况呀
按顺序出列,这个好像不重要吧?重要的是N个进程来消费啊,你也可以把你的消息手动分片入列,消费进程在手动按类型消费,达到手动分片目的
进程堵塞不影响,经常是串行执行,还是并行执行的会有影响,比如,设置了8个进程,是8个进程同时处理8个请求呢,还是要等其中的一个进程处理完请求,下一个进程才会处理请求
理想状况,N个核心就可以并行处理N个请求,超出就交替执行或者串行
竞争模型下,就是进程主要拿到就处理,如果满载那几乎是同时
N个进程来消费,是N个进程都在消费, 还是需等一个进程消费完了,其他进程在来消费
还有你的10M带宽也未必够,对方的100M带宽也未必是你独享
消费进程就是不断轮训队列,谁拿到就执行,满载就是全部都在执行
N个进程都在消费
https://www.workerman.net/doc/workerman/components/workerman-redis-queue.html 是用这个吗
把它想象城地铁的出入闸机就很好理解了
理解是理解,对应的文档不知道是哪个
这个就行了
好的,感谢大佬们
https://www.workerman.net/doc/workerman/components/workerman-redis-queue.html 这个不行
只适合设置一个进程,设置多个进程,会有很多数据同不了
为什么,不会的吧
多个count,onWorkerStart 会执行多次,然后数据就莫名不能同步了
1.有生产消息吗?2.没有消费到吗?3.消费了执行有问题吗?你是指的哪个环节
有生产记录,部分数据没有消费记录
那你打印一下,消费这里,1.有没有出列2.同步逻辑有无抛异常,异常了需需不要重新入列
同步逻辑没有异常,消费也没异常
没有数据进入队列,每次查看状态total_request都会增加,redis里没有数据,订阅那里打印也没有数据
设置了20个进程
那你就是生产消息这里啊,投递消息失败?
78 56581 0 [Summary]
pid memory listening worker_name connections send_fail timers total_request qps status
3534 4.19M none Redis 2 0 3 2176 0 [idle]
3535 4.19M none Redis 2 0 3 2176 0 [idle]
3536 4.19M none Redis 2 0 3 2176 0 [idle]
3537 4.19M none Redis 2 0 3 2176 0 [idle]
3538 4.19M none Redis 2 0 3 2176 0 [idle]
3539 4.19M none Redis 2 0 3 2176 0 [idle]
3540 4.19M none Redis 2 0 3 2176 0 [idle]
3541 4.19M none Redis 2 0 3 2176 0 [idle]
3542 4.19M none Redis 2 0 3 2176 0 [idle]
3543 4.19M none Redis 2 0 3 2176 0 [idle]
3544 4.19M none Redis 2 0 3 2176 0 [idle]
3545 4.19M none Redis 2 0 3 2176 0 [idle]
3546 4.19M none Redis 2 0 3 2176 0 [idle]
3547 4.19M none Redis 2 0 3 2176 0 [idle]
3548 4.19M none Redis 2 0 3 2176 0 [idle]
3549 4.19M none Redis 2 0 3 2176 0 [idle]
3550 4.19M none Redis 2 0 3 2177 0 [idle]
3551 4.19M none Redis 2 0 3 2176 0 [idle]
3552 4.19M none Redis 2 0 3 2176 0 [idle]
3553 4.19M none Redis 2 0 3 2176 0 [idle]
3554 4.19M none Redis 2 0 3 2177 0 [idle]
3555 4.19M none Redis 2 0 3 2177 0 [idle]
3556 4.19M none Redis 2 0 3 2178 0 [idle]
3557 4.19M none Redis 2 0 3 2176 0 [idle]
3558 4.19M none Redis 2 0 3 2176 0 [idle]
3559 4.19M none Redis 2 0 3 2176 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 104M - - 52 0 78 56581 0 [Summary]
pid memory listening worker_name connections send_fail timers total_request qps status
3534 4.19M none Redis 2 0 3 2283 0 [idle]
3535 4.19M none Redis 2 0 3 2283 0 [idle]
3536 4.19M none Redis 2 0 3 2283 0 [idle]
3537 4.19M none Redis 2 0 3 2283 0 [idle]
3538 4.19M none Redis 2 0 3 2283 0 [idle]
3539 4.19M none Redis 2 0 3 2283 0 [idle]
3540 4.19M none Redis 2 0 3 2283 0 [idle]
3541 4.19M none Redis 2 0 3 2283 0 [idle]
3542 4.19M none Redis 2 0 3 2283 0 [idle]
3543 4.19M none Redis 2 0 3 2283 0 [idle]
3544 4.19M none Redis 2 0 3 2283 0 [idle]
3545 4.19M none Redis 2 0 3 2283 0 [idle]
3546 4.19M none Redis 2 0 3 2283 0 [idle]
3547 4.19M none Redis 2 0 3 2283 0 [idle]
3548 4.19M none Redis 2 0 3 2283 0 [idle]
3549 4.19M none Redis 2 0 3 2283 0 [idle]
3550 4.19M none Redis 2 0 3 2284 0 [idle]
3551 4.19M none Redis 2 0 3 2283 0 [idle]
3552 4.19M none Redis 2 0 3 2283 0 [idle]
3553 4.19M none Redis 2 0 3 2283 0 [idle]
3554 4.19M none Redis 2 0 3 2284 0 [idle]
3555 4.19M none Redis 2 0 3 2284 0 [idle]
3556 4.19M none Redis 2 0 3 2285 0 [idle]
3557 4.19M none Redis 2 0 3 2283 0 [idle]
3558 4.19M none Redis 2 0 3 2283 0 [idle]
3559 4.19M none Redis 2 0 3 2283 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 104M - - 52 0 78 59363 0 [Summary]
total_request 这个数量为何会自动增加
没有数据入队列
----------------------------------------------PROCESS STATUS---------------------------------------------------
pid memory listening worker_name connections send_fail timers total_request qps status
3534 4.19M none Redis 2 0 3 2550 0 [idle]
3535 4.19M none Redis 2 0 3 2550 0 [idle]
3536 4.19M none Redis 2 0 3 2550 0 [idle]
3537 4.19M none Redis 2 0 3 2550 0 [idle]
3538 4.19M none Redis 2 0 3 2550 0 [idle]
3539 4.19M none Redis 2 0 3 2550 0 [idle]
3540 4.19M none Redis 2 0 3 2550 0 [idle]
3541 4.19M none Redis 2 0 3 2550 0 [idle]
3542 4.19M none Redis 2 0 3 2550 0 [idle]
3543 4.19M none Redis 2 0 3 2550 0 [idle]
3544 4.19M none Redis 2 0 3 2550 0 [idle]
3545 4.19M none Redis 2 0 3 2550 0 [idle]
3546 4.19M none Redis 2 0 3 2550 0 [idle]
3547 4.19M none Redis 2 0 3 2550 0 [idle]
3548 4.19M none Redis 2 0 3 2550 0 [idle]
3549 4.19M none Redis 2 0 3 2550 0 [idle]
3550 4.19M none Redis 2 0 3 2551 0 [idle]
3551 4.19M none Redis 2 0 3 2550 0 [idle]
3552 4.19M none Redis 2 0 3 2550 0 [idle]
3553 4.19M none Redis 2 0 3 2550 0 [idle]
3554 4.19M none Redis 2 0 3 2551 0 [idle]
3555 4.19M none Redis 2 0 3 2551 0 [idle]
3556 4.19M none Redis 2 0 3 2552 0 [idle]
3557 4.19M none Redis 2 0 3 2550 0 [idle]
3558 4.19M none Redis 2 0 3 2550 0 [idle]
3559 4.19M none Redis 2 0 3 2550 0 [idle]
----------------------------------------------PROCESS STATUS---------------------------------------------------
Summary 104M - - 52 0 78 66305 0 [Summary]
用redis客户端看,或者用命令看有没有数据,这不是看redis有没有数据的
redis客户端看了没有数据
那就投递消息有问题啊,你文档看了吗,知道怎么投递消息吧
在投递的数据加了个id,在订阅那里可以打印出来,进入消费了就记录id,但是有部分id会缺少
那这里应该是属于你业务上的bug,没代码也看不到怎么回事。流程没问题的。
有bug就全部都不会记录,执行业务方法的第一行就记录了id,不是执行完成后记录id
你异常处理了吗?看不到代码啊
$client->subscribe('async', function($data)use($syncService){
dump($data['id']);
$syncService->syncTgc($data);
});
public function syncTgc($data)
{
Log::info('syncTgc:'.$data['id']);
}
syncTgc第一行就记录了id
同步第三方数据,取决于你的带宽,对方的带宽,对方的处理速度
我方10M带宽,第三方100M带宽,用循环一个个去同步数据,go有个方法,循环数据打印出来的id是无徐的,workerman能实现吗