Here is a paper written by Willian Chen of SunLabs. He proposes a change to the CPC (CPU Performance Counters) subsystem whereby Solaris will buffer overflow events in the kernel.

In the interests of soliciting feedback from community members and being more public about the types of changes we're considering for Solaris, I'm posting this here for all to see and comment on before we submit it to PSARC.

-------
Project name : CPC in-kernel buffering

Project summary :

CPC in-kernel buffering adds a counter buffer such that the user can request the kernel to throw an overflow interrupt when the counter buffer overflows.

Business Summary :

Any application that requires low sampling overhead might benefit from in-kernel buffering. Our experiment shows that on average, 6-10% runtime can be saved using cpc in-kernel buffering.

Run-Time Dynamic Optimizer is a user of the CPC in-kernel buffering to reduce sampling overhead and to achieve better SPEC numbers. Run-time Dynamic Optimizer is also targetting commercial applications, such as Oracle, that do not ship profile-optimized binaries.

Profile collection of cache information for various compilers is another client for in-kernel buffering.

Technical Description :

Counter overflow interrupt is one usage of libcpc. Upon counter overflow, the likely useful information is the PC value of the instruction which triggered the event which caused the overflow. If the user is expected to accumulate a number of counter samples before the collected information becomes useful, then its possible to aggregate multiple counter overflow interrupts into a single interrupt by storing the counter samples into a PC buffer (ie. counter overflows are deferred and saved in the in-kernel buffer until the buffer overflows and only by then is the SIG_EMT delivered).

This proposal enhances libcpc with one additional command 'CPC_OVF_BUFFERED', and the function 'cpc_set_sample_pcbuf' to read the PC samples. By specifying CPC_OVF_BUFFERED, the user indicates that the PC information should be saved into the buffer of size 'CPC_PCBUF_SIZE' upon counter overflow, and uses the function cpc_set_sample_pcbuf for reading.

For example to trigger an interrupt only when the in-kernel buffer is filled, the user would add CPC_OVF_BUFFERED into the cpc request command as follows.

cpc_set_add_request(cpc, set, name, period,
    (CPC_COUNTER_USER | CPC_OVF_NOTIFY_EMT | CPC_OVF_BUFFERED),
    0, NULL);

And in the EMT handler, cpc_set_sample_pcbuf is called to copy back the buffered PC values into a user specified buffered area. After calling cpc_set_sample_pcbuf, the kernel buffer must be cleared.

High level overview of the proposed changes are as follows.

1. Create a new command CPC_OVF_BUFFERED.
2. Define size of PC buffer CPC_PCBUF_SIZE.
3. Implement cpc_set_sample_pcbuf to complement cpc_set_sample.
4. Implement kcpc_sample_pcbuf to complement kcpc_sample.
5. Modify kcpc_overflow_ast to buffer samples if command CPC_OVF_BUFFERED is issued.

Here is the proposed prototype for the new functions.

int cpc_set_sample_pcbuf(cpc_t *cpc, cpc_set_t *set, cpc_buf_t *buf,
    uint64_t *pcbuf);
int kcpc_sample_pcbuf(kcpc_set_t *set, uint64_t *buf, hrtime_t *hr_time,
    uint64_t *tick);

Here is the proposed change to the prototype of existing function.

int kcpc_overflow_ast(uint64_t pc);

Limitations :

1. Only PC values are stored in the buffer.

Thanks to William for this contribution. There were a few responses to this inside Sun which I will post shortly.

- Russ

-----------------------------------------------------
Russ Blaine | Solaris Kernel | [EMAIL PROTECTED]
_______________________________________________
perf-discuss mailing list
perf-discuss@opensolaris.org

Reply via email to