Loop shows post 5 times in a query

the_title() is a template tag which relies on global state. Specifically $post global variable, holding current post instance.

While you query a set of posts, you never set up that global state for template tag to use.

Though in case you started with get_posts() it might be more convenient to leave global state alone altogether and just use get_the_title(), which can retrieve title of specific post on demand.