Skip to content

worker process suffers CPU 100% usage #167

Open
@tokers

Description

@tokers

Hello!

The worker process CPU usage could be 100% if we use the following configuration pattern:

stream {
    server {
        listen 3105 reuseport;

        lua_check_client_abort on; # must be enabled

        content_by_lua_block {
            local sock, err = ngx.req.socket(true)

            sock:settimeout(1800 * 1000)

            local readline = sock:receiveuntil("\n")

            while not ngx.worker.exiting() do
                local line, err = readline(1)
                ngx.log(ngx.ERR, "line: ", line)
                if not line then
                    if err then
                        ngx.log(ngx.ERR, err)
                        break
                    end
                else
                    ngx.sleep(5000) -- other yieldable API is also applicable.
                end
            end
        }
    }
 }

Building a connection through nc and sending some characters then closing it, in the meanwhile, observing the CPU usage by top.

$ nc 127.0.0.1 3105
asjdkl
zxckj
^C

Now you can find the CPU usage reaches 100%.

It's irrelevant with the version of ngx_stream_lua, you can reproduce this problem even with the newest OpenResty.

After investigating the internal of stream-lua-nginx-module, I found it was caused by the indefinitely trigger of ngx_stram_lua_check_broken_connection, which doesn't the check ev->pending_eof flag.

BTW, this issue was found by @tianchaijz.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions