diff --git a/include/session.h b/include/session.h
index 2eaf1d9c88141a429f0d9acf4ffb4f1fca69c2e0..37c5799c410a77342979cd48cb205868ab0baba8 100644
--- a/include/session.h
+++ b/include/session.h
@@ -50,7 +50,7 @@
  * trigger fails or runs out of resources.
  */
 uint32_t
-session_create(int fd);
+session_create(int fd, uint64_t cookie);
 
 /**
  * Destroy a session.
diff --git a/src/admin.cc b/src/admin.cc
index 6512d9d424e0f84ef7ffa4106c7fbff2336863f1..308a475d8762430b365f2cfca5e18258b5632587 100644
--- a/src/admin.cc
+++ b/src/admin.cc
@@ -1962,6 +1962,7 @@ static void
 admin_handler(va_list ap)
 {
 	struct ev_io coio = va_arg(ap, struct ev_io);
+	struct sockaddr_in *addr = va_arg(ap, struct sockaddr_in *);
 	struct iobuf *iobuf = va_arg(ap, struct iobuf *);
 	lua_State *L = lua_newthread(tarantool_L);
 	int coro_ref = luaL_ref(tarantool_L, LUA_REGISTRYINDEX);
@@ -1979,7 +1980,7 @@ admin_handler(va_list ap)
 	 * a remote client: it's used in Lua
 	 * stored procedures.
 	 */
-	session_create(coio.fd);
+	session_create(coio.fd, *(uint64_t *) addr);
 	for (;;) {
 		if (admin_dispatch(&coio, iobuf, L) < 0)
 			return;
diff --git a/src/admin.rl b/src/admin.rl
index f336ca78eef57288569dbf2b7235a993d799a42e..59e5e06d3cfc9b68d298323fe1504546561f31aa 100644
--- a/src/admin.rl
+++ b/src/admin.rl
@@ -343,6 +343,7 @@ static void
 admin_handler(va_list ap)
 {
 	struct ev_io coio = va_arg(ap, struct ev_io);
+	struct sockaddr_in *addr = va_arg(ap, struct sockaddr_in *);
 	struct iobuf *iobuf = va_arg(ap, struct iobuf *);
 	lua_State *L = lua_newthread(tarantool_L);
 	int coro_ref = luaL_ref(tarantool_L, LUA_REGISTRYINDEX);
@@ -360,7 +361,7 @@ admin_handler(va_list ap)
 	 * a remote client: it's used in Lua
 	 * stored procedures.
 	 */
-	session_create(coio.fd);
+	session_create(coio.fd, *(uint64_t *) addr);
 	for (;;) {
 		if (admin_dispatch(&coio, iobuf, L) < 0)
 			return;
diff --git a/src/coio.cc b/src/coio.cc
index 677b726a1ead2d0d9aa86150b7b6181f71db3f57..3d143d9a2f0a0b43c449127463adb221b3486185 100644
--- a/src/coio.cc
+++ b/src/coio.cc
@@ -568,7 +568,7 @@ coio_service_on_accept(struct evio_service *evio_service,
 	 * Start the created fiber. It becomes the coio object owner
 	 * and will have to close it and free before termination.
 	 */
-	fiber_call(f, coio, iobuf, service->handler_param);
+	fiber_call(f, coio, addr, iobuf, service->handler_param);
 }
 
 void
diff --git a/src/iproto.cc b/src/iproto.cc
index aa0104d66a1949e043d2feb4f557154a349b2c00..61cab9371f770a70246ecf3d5c30ba7b74c0c0dc 100644
--- a/src/iproto.cc
+++ b/src/iproto.cc
@@ -328,21 +328,9 @@ iproto_process_connect(struct iproto_request *request);
 static void
 iproto_process_disconnect(struct iproto_request *request);
 
-static uint64_t
-get_cookie_by_socket(int fd)
-{
-	uint64_t cookie = 0;
-	unsigned int addrlen = (unsigned int)sizeof(cookie);
-	int get_res = getpeername(fd, (sockaddr*)&cookie, &addrlen);
-	if (get_res != 0) {
-		say_warn("getpeername failed");
-		return 0;
-	}
-	return cookie;
-}
-
 static struct iproto_session *
-iproto_session_create(const char *name, int fd, box_process_func *param)
+iproto_session_create(const char *name, int fd, struct sockaddr_in *addr,
+		      box_process_func *param)
 {
 	struct iproto_session *session;
 	if (SLIST_EMPTY(&iproto_session_cache)) {
@@ -362,7 +350,7 @@ iproto_session_create(const char *name, int fd, box_process_func *param)
 	session->parse_size = 0;
 	session->write_pos = obuf_create_svp(&session->iobuf[0]->out);
 	session->sid = 0;
-	session->cookie = get_cookie_by_socket(fd);
+	session->cookie = *(uint64_t *) addr;
 	return session;
 }
 
@@ -717,7 +705,7 @@ iproto_process_connect(struct iproto_request *request)
 	struct iobuf *iobuf = request->iobuf;
 	int fd = session->input.fd;
 	try {              /* connect. */
-		session->sid = session_create(fd);
+		session->sid = session_create(fd, session->cookie);
 	} catch (const ClientError& e) {
 		iproto_reply_error(&iobuf->out, request->header, e);
 		try {
@@ -767,7 +755,7 @@ iproto_on_accept(struct evio_service *service, int fd,
 
 	box_process_func *process_fun =
 		(box_process_func*) service->on_accept_param;
-	session = iproto_session_create(name, fd, process_fun);
+	session = iproto_session_create(name, fd, addr, process_fun);
 	iproto_enqueue_request(&request_queue, session,
 			       session->iobuf[0], &dummy_header,
 			       iproto_process_connect);
diff --git a/src/memcached.cc b/src/memcached.cc
index 7e99cf54a610db095008801dab29bae87d7b5a1d..1311fac54f6921e8a4c64e0c90e99e2ecbcea679 100644
--- a/src/memcached.cc
+++ b/src/memcached.cc
@@ -412,10 +412,13 @@ static void
 memcached_handler(va_list ap)
 {
 	struct ev_io coio = va_arg(ap, struct ev_io);
+	struct sockaddr_in *addr = va_arg(ap, struct sockaddr_in *);
 	struct iobuf *iobuf = va_arg(ap, struct iobuf *);
 	stats.total_connections++;
 	stats.curr_connections++;
 
+	(void) addr;
+
 	try {
 		auto scoped_guard = make_scoped_guard([&] {
 			fiber_sleep(0.01);
diff --git a/src/session.cc b/src/session.cc
index bcb7af3d1b8bb90807658ef820345b2f6e83b8d9..eeb9c524eab9798e985352bf4eba031f537c0305 100644
--- a/src/session.cc
+++ b/src/session.cc
@@ -40,21 +40,8 @@ static struct mh_i32ptr_t *session_registry;
 struct session_trigger session_on_connect;
 struct session_trigger session_on_disconnect;
 
-static uint64_t
-get_cookie_by_socket(int fd)
-{
-	uint64_t cookie = 0;
-	unsigned int addrlen = (unsigned int)sizeof(cookie);
-	int get_res = getpeername(fd, (sockaddr*)&cookie, &addrlen);
-	if (get_res != 0) {
-		say_warn("getpeername failed");
-		return 0;
-	}
-	return cookie;
-}
-
 uint32_t
-session_create(int fd)
+session_create(int fd, uint64_t cookie)
 {
 	/* Return the next sid rolling over the reserved value of 0. */
 	while (++sid_max == 0)
@@ -75,7 +62,7 @@ session_create(int fd)
 	 * Run the trigger *after* setting the current
 	 * fiber sid.
 	 */
-	fiber_set_sid(fiber, sid, get_cookie_by_socket(fd));
+	fiber_set_sid(fiber, sid, cookie);
 	if (session_on_connect.trigger) {
 		void *param = session_on_connect.param;
 		try {