执行insert select语句,通过show processlist+kill id杀掉进程后,后台仍然占用资源

执行大数据量的insert select语句,执行没多久后,发现session参数需要调整下,于是通过show processlist+kill id杀掉进程,kill掉1次后,再次show processlist,相同insert sql会有新的id再跑,如此反复kill3次后,才干掉进程:



但反复kill掉进程直至show processlist不再出现该insert sql后,集群仍有大量资源被占用:

查看starrocks fe的webUI,上面还有3个transaction在运行:

试了很多方法,包括cancel load等都无法终止这3个transaction,show processlist也找不到正在执行的insert sql,集群资源一直被大量占用。

请问这种情况该怎么kill掉对应的进程呢?

是不是跑了其他的insert任务呀,这个看上去跟之前不是一个任务了,id都不一样了。

集群里就那一个任务,而且等集群资源占用率恢复平常后,我查了下profile,之前我kill掉的那条insert sql还是执行了,跑了30分钟左右。
刚刚去仔细查了下profile,那段时间有三条一模一样的sql执行了

这三段sql的提交时间和上面fe webUI里看到的三个transaction的PrepareTime一一对应。
看样子那段sql我kill了三次,结果都没kill成功,反而重复执行了3次sql

这个样子是不是check下是不是多次执行了这个sql呢?这个问题我本地没有复现出来呢。

这个是因为,我们会预留一些内存在StarRocks里,延时还给OS,这些内存实际是可以复用的。curl -XGET -s http://BE_IP:BE_HTTP_PORT/metrics | grep “^starrocks_be_.*_mem_bytes|^starrocks_be_tcmalloc_bytes_in_use” 这个 starrocks_be_tcmalloc_bytes_in_use 是实际使用的内存


但profile里,这三条sql都是执行成功了的
profile里这三条sql一模一样,这段sql我只提交了一次,然后kill了三次

我之前也遇到过,kill之后会调起同样的SQL, 好像会有三次,继续把新调起的一样的的查询kill掉 多kill几次就行了。 不知道是 MySQL client 还是fe的重试机制

好的,我们复现和修复下

复现场景:
如果mysql client和starrocks在一个局域网内的时候,不会出现自动重连,测试时发现只有当mysql client和starrocks不在一个局域网内的时候才会复现,mysql需要通过ssh tunnel去连接starrocks所在的端口
解决方案:

  1. 可以在mysql的连接的时候直接使用–skip-reconnect来disable自动重连
  2. 可以通过ctrl + c取消insert into,直接在同一个session操作即可
  3. https://github.com/StarRocks/starrocks/pull/11668 这一个pr可以修复,它会在close session之前发送cancel给mysql client,mysql client在收到cancel之后不会自动重连。
1赞