%\documentclass[english]{fitthesis} % for submission to the IS FIT and/or print with color links - links are color
%\documentclass[english,zadani,print]{fitthesis} % for the black and white print - links are black
%\documentclass[english,zadani,cprint]{fitthesis} % for the print - links are black, logo is color
\documentclass[english,zadani]{fitthesis}

% Setting of a path to the pictures
\graphicspath{{pictures/}{./pictures/}}

% disables function of the template which replaces quotation marks
% to avoid unnecessary replacements in the API descriptions etc.
\csdoublequotesoff

\let\mc\multicolumn

% Information about the thesis
%---------------------------------------------------------------------------
\projectinfo{
  % Thesis
  project={BP},
  year={2023}, % Year of submission
  date=\today, % Submission date
  % Thesis title
  title.cs={Analýza spotřeby zdrojů v programech},
  title.en={Analysis of software resource consumption},
  %title.length={14.5cm}, % setting the length of a block with a thesis title for adjusting a line break (can be defined here or below)
  %sectitle.length={14.5cm}, % setting the length of a block with a second thesis title for adjusting a line break (can be defined here or below)
  %dectitle.length={14.5cm}, % setting the length of a block with a thesis title above declaration for adjusting a line break (can be defined here or below)
  % Author
  author.name={Ondřej},
  author.surname={Míchal},
  % Supervisor
  supervisor.name={Jiří}, 
  supervisor.surname={Pavela},
  supervisor.title.p={Ing.},
  % Keywords
  keywords.cs={perun, spotřeba energie, profilování, verzovací systém, vcs, ebpf, rapl, perf, systemová volání}, % keywords in Czech
  keywords.en={perun, energy consumption, profiling, version control system, vcs, ebpf, rapl, perf, system calls}, % keywords in English
  % Abstract
  abstract.cs={Spotřeba softwarových zdrojů je široce a aktivně zkoumanou oblastí. Z mnoha zdrojů v softwaru, které lze profilovat, byla spotřeba energie dlouho jediným zdrojem, který neměl mnoho obecných, a přesto komplexních, profilerů. V době mobilních zařízení a výkonných výpočetních jednotek je poptávka po takových profilerech neustále rostoucí. V této práci zkoumáme metody pro přesné měření spotřeby energie softwaru. Na jejich základě vytváříme open-source profiler a implementujeme komplexní vizualizér profilovaných dat. S vytvořeným profilerem pak provádíme řadu experimentů, abychom předvedli jeho schopnosti a demonstrovali užitečnost měření spotřeby energie softwaru.}, % abstract in Czech
  abstract.en={Software resource consumption is a widely and actively researched area. Of the many resources utilized by software which can be profiled, energy consumption has long been the one resource without many generic, and yet comprehensive profilers. In the age of mobile devices and efficient processing units the need for such profiles is continuously increasing. In this work, we research methods for accurate measurement of energy consumption of software based on them create an open-source profiler and implement a comprehensive visualizer of the profiled data. Using the developed profiler we conduct a number of experiments to showcase its capabilities and demonstrate the usefulness of measuring software energy consumption.}, % abstract in English
  % Extended Abstract
  extendedabstract={V současné době se spotřeba zdrojů softwaru stává stále častěji předmětem zájmu uživatelů i vývojářů softwaru. Vzhledem k tomu, že na trhu s elektronikou dominují mobilní zařízení, je potřeba optimální spotřeby zdrojů více než zřejmá. Ale stejná potřeba platí i pro jiné typy zařízení. Osobní stolní počítače, servery (především v oblasti HPC), zařízení IoT nebo jiné chytré stroje musí také pracovat efektivně.

Existuje poměrně široká škála různých zdrojů, které může software spotřebovávat. Pro mnoho z nich lze využít nepřeberné množství existujících analyzačních nástrojů, které pokryjí většinu, ne-li všechny případy použití. Mnohé z těchto zdrojů však ještě čekají na řádný výzkum. Zdrojem, který postrádá dobře zavedené nástroje, je spotřeba energie. Zdroje jako procesorový čas nebo paměť jsou ve většině softwaru optimalizovány, protože jejich optimalizace je nejjednodušší. Pokud by měl vývojář softwaru ve své sadě nástrojů i nástroj pro rychlou, spolehlivou a podrobnou analýzu spotřeby energie svého softwaru, mohl by začít optimalizovat software také pro optimální spotřebu energie. Optimalizace výkonu může často vést k přehřívání a obecně k nepříznivému poměru mezi dobou běhu a spotřebovanou energií, což by optimalizace spotřeby energie mohla pomoci zmírnit.

V současné době většina nástrojů pro Linux, které podporují měření spotřeby energie, neposkytuje dostatečně podrobné informace a chybí jim jakýkoliv kontext. Mezi stávající nástroje patří \emph{powertop}~\cite{venPowerTOP2023} nebo \emph{turbostart}~\cite{torvaldsTorvaldsLinux2023}. Považujeme to za příležitost využít současnou nejmodernější technologii a existující výzkum k vytvoření open-source profileru pro podrobné profilování spotřeby energie. Věříme, že takový profiler by mohl být použit jako odrazový můstek pro další výzkum, zejména pokud by byl využit v nějakém širším projektu pro analýzu výkonu softwaru. Takovým projektem je Perun~\cite{fiedorPerunLightweightPerformance2022}, open-source nástroj pro průběžné testování výkonu softwaru, vyvinutý výzkumnou skupinou \emph{VeriFIT} na \emph{VUT FIT}.

V této práci vytváříme první prototyp open-source energetického profileru, který bude integrován do systému Perun, a nástroj pro vizualizaci dat výsledných profilů. Ke sledování spotřeby energie systému by bylo možné použít externí hardware monitory, ale ty nemají požadovanou granularitu, mohou měřit spotřebu energie pouze jako celek a nejsou běžnou součástí dodávaného hardwaru u zařízení. Místo toho používáme čistě softwarové řešení využívající \emph{Running Average Power Limit} (\emph{RAPL}), což je funkce dostupná v moderních procesorech Intel (zavedená v generaci procesorů \emph{Sandy Bridge}) a v současné době podporovaná i některými procesory AMD. Toto rozhraní prokazatelně~\cite{hackenbergEnergyEfficiencyFeature2015,khanRAPLActionExperiences2018,garciaExplorationEnergyConsumption2019} poskytuje vysoce kvalitní údaje o spotřebě energie s vysokou úrovní granularity. Pro poskytnutí kontextu pro spotřebu energie sledujeme systémová volání. Stávající výzkum~\cite{pathakWhereEnergySpent2012,10.5555/2735522.2735546} ukazuje potenciál systémových volání k poskytnutí potřebného kontextu pro spotřebu energie. Implementace výsledků zmíněného výzkumu v plném rozsahu je mimo rozsah této práce, proto používáme mnohem jednodušší přístup, který přesto demonstruje potenciál energetického profileru. Ke sledování systémových volání a vzorkování údajů o spotřebě energie používáme technologii \emph{eBPF}. Ta umožňuje spouštět programy v \emph{sandboxu}\footnote{prostředí pro spuštění software s omezenými privilegii za účelem bezpečnosti} v privilegovaném kontextu, jako je linuxové jádro. Použitím \emph{eBPF} dosáhneme vysoké granularity vzorkovaných dat, přičemž výkon profilovaného softwaru ovlivníme jen minimálně. Při testování jsme mohli vzorkovat spotřebu energie rychlostí tisíce vzorků za sekundu, aniž bychom významně ovlivnili výkon profilovaného procesu. Společně s profilerem jsme implementovali i nástroj pro vizualizaci výstupních profilovacích dat pomocí knihoven jazyka Python, jako jsou Pandas, Seaborn a Matplotlib. Vytvořené grafy zahrnují heatmapu nebo vodopádový graf.

S vytvořeným profilerem jsme provedli řadu experimentů, které ukazují jeho možnosti. Jako předmět testování jsme použili grafický shell GNOME Shell, protože se jedná o netriviální software využívající všechny obecné hardwarové komponenty (CPU, RAM, GPU), který je velmi náchylný na režii způsobenou profilery. Pro experimenty jsme použili jeden testovací scénář, ale měnili jsme prostředí, ve kterých byly experimenty vykonávány, abychom zjistili, jak moc ovlivní výsledky profileru a jak moc je profiler náchylný na šum. Experimenty ukázaly, že profiler dokáže úspěšně lokalizovat zdroje vysoké spotřeby profilovaného softwaru a že rozdíly běhových prostředí mohou ovlivnit kvalitu výsledných profilů.},
  % Declaration (for thesis in english should be in english)
  declaration={I hereby declare that this Bachelor's thesis was prepared as an original work by the author under the supervision of Ing. Jiří Pavela. The supplementary information was provided by Ing. Tomáš Fiedor Ph.D. I have listed all the literary sources, publications and other sources, which were used during the preparation of this thesis.},
  % Acknowledgement (optional, ideally in the language of the thesis)
  acknowledgment={I would like to thank my supervisors Ing. Jiří Pavela and Ing. Tomáš Fiedor Ph.D. from the VeriFIT performance team for their guidance, honest feedback and support while making this thesis.},
  faculty={FIT},    
  % Department
  department={UITS}, % fill in appropriate abbreviation of the department according to assignment: UPSY/UIFS/UITS/UPGM
}

%\extendedabstract{Do tohoto odstavce bude zapsán výtah (abstrakt) práce v českém (slovenském) jazyce.}
% Should extended abstract start on the odd page?
%\extabstractodd{true}

% Setting the length of a block with a thesis title for adjusting a line break - can be defined here or above
%\titlelength{14.5cm}
% Setting the length of a block with a second thesis title for adjusting a line break - can be defined here or above
%\sectitlelength{14.5cm}
% Setting the length of a block with a thesis title above declaration for adjusting a line break - can be defined here or above
%\dectitlelength{14.5cm}

% solves first/last row of the paragraph on the previous/next page
\clubpenalty=10000
\widowpenalty=10000

% checklist
\newlist{checklist}{itemize}{1}
\setlist[checklist]{label=$\square$}

% If you do not want enlarged spacing for filling of the pages in case of duplex printing, uncomment the following line
% \raggedbottom

\usepackage{url}
\ifWis
\ifx\pdfoutput\undefined % nejedeme pod pdflatexem / we are not using pdflatex
\else
  \usepackage{color}
  \usepackage[unicode,colorlinks,hyperindex,plainpages=false,pdftex]{hyperref}
  \definecolor{hrcolor-ref}{RGB}{223,52,30}
  \definecolor{hrcolor-cite}{HTML}{2F8F00}
  \definecolor{hrcolor-urls}{HTML}{092EAB}
  \hypersetup{
	linkcolor=hrcolor-ref,
	citecolor=hrcolor-cite,
	filecolor=magenta,
	urlcolor=hrcolor-urls
  }
  \def\pdfBorderAttrs{/Border [0 0 0] }  % bez okrajů kolem odkazů / without margins around links
  \pdfcompresslevel=9
\fi
\else % pro tisk budou odkazy, na které se dá klikat, černé / for the print clickable links will be black
\ifx\pdfoutput\undefined % nejedeme pod pdflatexem / we are not using pdflatex
\else
  \usepackage{color}
  \usepackage[unicode,colorlinks,hyperindex,plainpages=false,pdftex,urlcolor=black,linkcolor=black,citecolor=black]{hyperref}
  \definecolor{links}{rgb}{0,0,0}
  \definecolor{anchors}{rgb}{0,0,0}
  \def\AnchorColor{anchors}
  \def\LinkColor{links}
  \def\pdfBorderAttrs{/Border [0 0 0] } % bez okrajů kolem odkazů / without margins around links
  \pdfcompresslevel=9
\fi
\fi
\usepackage[all]{hypcap}

% Compilation piecewise (faster, but not all parts in preview will be up-to-date)
\usepackage{subfiles}

\makeglossaries

\begin{document}
  \maketitle

  \setlength{\parskip}{0pt}
  % Table of Contents
  % ----------------------------------------------
  {\hypersetup{hidelinks}\tableofcontents}
  
  % List of figures and list of tables (if the thesis contains a lot of pictures, it is good)
  % {\hypersetup{hidelinks}\listoffigures}
  % {\hypersetup{hidelinks}\listoftables}
  
  \renewcommand*\glossaryname{Glossary}
  \renewcommand*\entryname{Abbreviation}
  \renewcommand*\descriptionname{Meaning}
  
    \newglossaryentry{hpc}
    {
        name=HPC,
        description={High-performance computing}
    }
    \newglossaryentry{dynamic-software-analysis}
    {
        name=dynamic software analysis,
        description={Analysis of software during its execution}
    }
    \newglossaryentry{energy-profile}
    {
        name=energy profile,
        description={The energy consumed at a certain point of time}
    }
    \newglossaryentry{graphical shell}
    {
        name=graphical shell,
        description={A software providing a graphical user interface enabling the user to make use of the computer's capabilities in a convenient way}
    }
    \newglossaryentry{display server}
    {
        name=display server,
        description={A software coordinating the input and output of its clients between the operating system and the system's hardware}
    }
    \newglossaryentry{object-centric-data-grouping}
    {
        name={object-centric data grouping},
        description={Data grouping where all the data of a single object are grouped by the object they belong to}
    }
    \newglossaryentry{attribute-centric-data-grouping}
    {
        name={attribute-centric data grouping},
        description={Data grouping where all the data of a single object are grouped by their attribute}
    }
    \newglossaryentry{msr}
    {
        name=MSR,
        description={Model-Specific Register}
    }
    \newglossaryentry{pid}
    {
        name=PID,
        description={Process ID}
    }
    \newglossaryentry{tid}
    {
        name=TID,
        description={Thread ID}
    }
    \newglossaryentry{tgid}
    {
        name=TGID,
        description={Thread-Group ID}
    }
    \newglossaryentry{iqr}
    {
        name=IQR,
        description={Interquartile range}
    }
    \newglossaryentry{iot}
    {
        name=IoT,
        description={Internet of Things}
    }
    \newglossaryentry{ffi}
    {
        name={FFI},
        description={Foreign Function Interface}
    }
    \newglossaryentry{ringbuffer}
    {
        name={ringbuffer},
        description={A data structure with fixed size buffer allowing to loop through the buffer}
    }
    \newglossaryentry{sysfs}
    {
        name={sysfs},
        description={A pseudo file system in the Linux kernel providing access to various information about the kernel, drivers and hardware devices}
    }
    \newglossaryentry{tmpfs}
    {
        name={tmpfs},
        description={A temporary file system where data is stored in a volatile memory rather than persistent storage}
    }
    \newglossaryentry{pmu}
    {
        name={PMU},
        description={Processor Monitoring Unit}
    }
    \newglossaryentry{cli}
    {
        name={CLI},
        description={Command-Line Interface}
    }
    \newglossaryentry{userspace}
    {
        name={user-space},
        description={A section of computer's operating memory outside of kernel-space}
    }
    \newglossaryentry{kernelspace}
    {
        name={kernel-space},
        description={A section of computer's operating memory reserved exclusively for use by the operating system kernel}
    }
    \newglossaryentry{daemon}
    {
        name={daemon},
        description={A process running in the background}
    }
    \newglossaryentry{compositing}
    {
        name={compositing},
        description={A process of combining multiple image sources into a single image}
    }
    \newglossaryentry{vcs}
    {
        name={VCS},
        description={Version Control System}
    }
    \newglossaryentry{api}
    {
        name={API},
        description={Application Programming Interface}
    }
    \newglossaryentry{abi}
    {
        name={ABI},
        description={Application Binary Interface}
    }
    \newglossaryentry{out-of-tree-software}
    {
        name={out-of-tree},
        description={Not developed as part of the main project}
    }
    \newglossaryentry{jit}
    {
        name={JIT},
        description={Just-In-Time}
    }
    \newglossaryentry{ci}
    {
        name={CI},
        description={Continuous Integration}
    }
    \newglossaryentry{callgraph}
    {
        name={callgraph},
        description={A type of control-flow graph showing the relationship between function calls in software}
    }
    \newglossaryentry{llc-cache}
    {
        name={LLC},
        description={Last Level Cache}
    }

  \setglossarystyle{superragged}
  \printglossaries

  \ifODSAZ
    \setlength{\parskip}{0.5\bigskipamount}
  \else
    \setlength{\parskip}{0pt}
  \fi

  % Skip the page in the two-sided mode
  \iftwoside
    \cleardoublepage
  \fi

  % Thesis text
  % ----------------------------------------------

  \subfile{{./chapters/introduction}} % motivation, goals, threats to validity, thesis structure
  \subfile{{./chapters/background-research}} % knowledge of developers, existence of convenient tools notable papers, summary of different approaches to profiling
  \subfile{{./chapters/perun}}
  \subfile{{./chapters/ebpf}}
  \subfile{{./chapters/energy-methods-technology}} % different methods based on papers - syscalls, syscall FSM, I/O bundles; RAPL
  \subfile{{./chapters/requirements-analysis}} % Analaysis of requirements (function, non-functional, non-goals)
  \subfile{{./chapters/sysrapl}} % architecture, language, integration in Perun, RAPL/syscall/FSMs/IO bundles implementations, features, limitations, output format
  \subfile{{./chapters/experiments}} % real-life projects + my project
  \subfile{{./chapters/conclusion}} % Conclusion of the work, future outlook

  % Bibliography
  % ---------------------------------------------- 
  \makeatletter
  \def\@openbib@code{\addcontentsline{toc}{chapter}{Bibliography}}
  \makeatother
  \bibliographystyle{bib-styles/Pysny/enplain}

  \begin{flushleft}
    \bibliography{bibliography}
  \end{flushleft}

  % Skip the page in the two-sided mode
  \iftwoside
    \cleardoublepage
  \fi

  % Appendices
  % ---------------------------------------------
  \appendix
  \appendixpage

  % Skip the page in the two-sided mode
  \iftwoside
    \cleardoublepage
  \fi
  
  \section*{List of Appendices}
  \addcontentsline{toc}{section}{List of Appendices}
  \startcontents[chapters]
  \setlength{\parskip}{0pt}
  % list of appendices
  \printcontents[chapters]{l}{0}{\setcounter{tocdepth}{2}}
  
  \ifODSAZ
    \setlength{\parskip}{0.5\bigskipamount}
  \else
    \setlength{\parskip}{0pt}
  \fi
  
  % Skip the page in the two-sided mode
  \iftwoside
    \cleardoublepage
  \fi
  
  % Appendices
  \subfile{chapters/appendices}
\end{document}
